Телеграмма для Mikrotik...
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
Рад помочь. Будет очень интересно посмотреть!
-
- Сообщения: 25
- Зарегистрирован: 05 ноя 2022, 21:27
Прошу помощи с решением задачи
Использую такой код в teMessageResponse
Из ваших подсказок я понял как отрабатывать запросы на нажатие Reply кнопки.
Была нажата кнопка "Status Router" и получен ответ $teSystemMenu
Допустим дальше нажал кнопку "Modules" и получил ответ $teModules.
Есть ли возможность удалять предыдущие ответы бота с чата?
Как текст удалять я разобрался а вот как удалять предыдущие сообщения увы нет.
Надеюсь я еще не надоел вам своими просьбами.
Заранее спасибо.
Использую такой код в teMessageResponse
Код: Выделить всё
:if ($messageText~"Status Router") do={
:if ([$teRightsControl fMethod=get fGroupID=$userChatID fRightName=root]) do={
$teSystemMenu fChatID=$userChatID
:return true
}
}
:if ($messageText~"Modules") do={
:if ([$teRightsControl fMethod=get fGroupID=$userChatID fRightName=root]) do={
$teModules fChatID=$userChatID
:return true
}
}
Была нажата кнопка "Status Router" и получен ответ $teSystemMenu
Допустим дальше нажал кнопку "Modules" и получил ответ $teModules.
Есть ли возможность удалять предыдущие ответы бота с чата?
Как текст удалять я разобрался а вот как удалять предыдущие сообщения увы нет.
Надеюсь я еще не надоел вам своими просьбами.
Заранее спасибо.
- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
В этом и недостаток таких кнопок. Сложно реализовать принцип одного окна. При нажатии обычной кнопки под сообщением, мы в колбэке получаем ИД этого сообщения и можем его редактировать.
А в случае с reply кнопками мы получаем номер того сообщения, которое в кнопке зашито. С остальными сделать ничего не можем. Только если записывать номера всех отправленных сообщений, но это тот еще гемор.
А в случае с reply кнопками мы получаем номер того сообщения, которое в кнопке зашито. С остальными сделать ничего не можем. Только если записывать номера всех отправленных сообщений, но это тот еще гемор.
-
- Сообщения: 25
- Зарегистрирован: 05 ноя 2022, 21:27
У меня получилосьBrook писал(а): ↑29 авг 2023, 22:21 В этом и недостаток таких кнопок. Сложно реализовать принцип одного окна. При нажатии обычной кнопки под сообщением, мы в колбэке получаем ИД этого сообщения и можем его редактировать.
А в случае с reply кнопками мы получаем номер того сообщения, которое в кнопке зашито. С остальными сделать ничего не можем. Только если записывать номера всех отправленных сообщений, но это тот еще гемор.

Несколько дней на это убил но в итоге получился боле или менее рабочий вариант
Принцип такой после нажатии reply кнопки бот отвечает на это сообщение "Start menu Status Router" а после этого запускает меню. Сообщение использовал для того чтоб получить messageID, так увы не понял как его определить в сообщении (меню). После того как меню появляется в чате предыдущие сообщения удаляются.
При этом предусмотрел вариант что несколько людей будут использовать бот и предыдущие сообщения будут удалятся только у конкретного пользователя.
Если интересно могу скинуть код, только там ужас

- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
Коллеги, прочитал в одном из топиков, что мой код сложный для понимания. Если рассматривать его в целом, то да, наверное. Там логика не простая. Но если его расслоить, то получается не сильно сложно.
Половина кода - это библиотека для самого Телеграмма. Там реализованы почти все функции из API Телеги и называются они почти так же. Их можно использовать отдельно от остального кода. Все лежит в папке Library.

Наверное, опубликую их отдельно вместе с описанием использования. Разворачивать можно отдельно каждую, по необходимости.
upd: Инсталлятор тоже будет.
Половина кода - это библиотека для самого Телеграмма. Там реализованы почти все функции из API Телеги и называются они почти так же. Их можно использовать отдельно от остального кода. Все лежит в папке Library.

Наверное, опубликую их отдельно вместе с описанием использования. Разворачивать можно отдельно каждую, по необходимости.
upd: Инсталлятор тоже будет.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Вот это стоящее дело ! ждём !
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
-
- Сообщения: 25
- Зарегистрирован: 05 ноя 2022, 21:27
Не знаю на сколько это будет полезно но опубликую свои доработки
Эти скрипты нужны при использовании reply кнопок, при переходе в новое меню
предыдущие сообщения удаляются.
Скрипт - teAddvalue
Скрипт teAddsearchvalue
И часть кода для teMessageResponse
Эти скрипты нужны при использовании reply кнопок, при переходе в новое меню
предыдущие сообщения удаляются.
Скрипт - teAddvalue
Код: Выделить всё
#---------------------------------------teAddvalue----------------------------------------------------
# $teNumberMessage - variable data entry
#--------------------------------------teAddvalue----------------------------------------------------
# Function for adding a value to the array
:global teAddvalue
:if (!any $teAddvalue) do={
:global teAddvalue do={
:global teNumberMessage
:set $teNumberMessage ("$teNumberMessage $newvalueTEST1")
:set $teNumberMessage ("$teNumberMessage ; $newvalueTEST2 ;")
}
}
Код: Выделить всё
#---------------------------------------teAddsearchvalue----------------------------------------------------
# $teNumberMessage - variable data entry
#--------------------------------------teAddsearchvalue----------------------------------------------------
:global teAddsearchvalue
:if (!any $teAddsearchvalue) do={
:global teAddsearchvalue do={
# Set the original string
:global teNumberMessage
# Initialize the variable to store the found block
:global teNumberMessageTime
:global teNumberMessageTimeOk
:global teNumberMessageTimeOff
:global teNumberMessageTimeDell
:global teDeleteMessage
# Initialize a variable to store the updated string
:local updatedMessage
:local matchCount 0
# Define a flag to control the loop
:local continueSearch true
# Use a while loop to continue searching until there are no more blocks
:while ($continueSearch) do={
:local blockPos [:len [:find $teNumberMessage ";"]]
# If no more blocks are found, exit the loop
:if ($blockPos = 0) do={
:set teNumberMessage ($teNumberMessageTimeOff)
:set teNumberMessageTimeOff ""
:set teNumberMessageTimeOk ""
:set continueSearch false
} else={
# Iterate through the blocks
:put [ :toarray [:find $teNumberMessage ";"]]
:foreach block in=[ :toarray [:find $teNumberMessage ";"]] do={
:local blockText [:pick [:tostr $teNumberMessage] 0 $block]
:if ([:find $blockText $searchValue] >= 0) do={
:set matchCount ($matchCount + 1)
#:log info ("Found a block with the first part $searchValue, current match count: $matchCount")
# Store the found block in teNumberMessageTimeOk
:set teNumberMessageTimeOk ($teNumberMessageTimeOk . $blockText)
# Find and store the number after the "-"
:local hyphenPos [:find $blockText "-"]
:local numberAfterHyphen [:pick $blockText ($hyphenPos + 1) [:len $blockText]]
:set teNumberMessageTimeDell $numberAfterHyphen
$teDeleteMessage fChatID=$searchValue fMessageID=$numberAfterHyphen
# Remove the found block from teNumberMessage
:set teNumberMessage [:pick $teNumberMessage ([:len $blockText] + 1) [:len $teNumberMessage]]
:delay 500ms
} else={
# If the block doesn't match, add it to the updatedMessage
:set teNumberMessageTimeOff ("$teNumberMessageTimeOff$blockText;")
# Remove the not found block from teNumberMessage
:set teNumberMessage [:pick $teNumberMessage ([:len $blockText] + 1) [:len $teNumberMessage]]
}
}
}
# Output the number of matches
#:put ("Number of matches in the string: $matchCount")
# If there's a remaining block in teNumberMessage, add it to updatedMessage
:if ([:len $teNumberMessage] > 0) do={
:set updatedMessage ($updatedMessage . $teNumberMessage)
}
}
}
}
Код: Выделить всё
:global teAddvalue
:global teAddsearchvalue
:if ($messageText~"Status Router") do={
:local mesing []
:local searchValue []
:set messageID [$teSendMessage fChatID=$queryChatID fText="Start menu Status Router"]
:set mesing ($messageID + 1)
:local newvalueTEST1 []
:local newvalueTEST2 []
:set searchValue $userChatID
:set newvalueTEST1 ("$userChatID-$messageID")
:set newvalueTEST2 ("$userChatID-$mesing")
:if ([$teRightsControl fMethod=get fGroupID=$userChatID fRightName=root]) do={
$teSystemMenu fChatID=$userChatID
$teAddsearchvalue searchValue=$searchValue
$teAddvalue newvalueTEST1=$newvalueTEST1 newvalueTEST2=$newvalueTEST2
:return true
}
}
- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
Друзья, выделил функции Телеги в отдельные файлы.
Их можно развернуть командой import и использовать отдельно.
Например для отправки сообщения:
Результатом работы функции будет номер сообщения.
Код опубликовал в Телеграм-канале.
Их можно развернуть командой import и использовать отдельно.
Код: Выделить всё
import file-name=teMessages.rsc
import file-name=teInterface.rsc
Код: Выделить всё
:put [$teSendMessage fBotID=$botID fChatID=$chatID fText="Test Text"]
Код опубликовал в Телеграм-канале.
-
- Сообщения: 1657
- Зарегистрирован: 15 сен 2017, 09:03
Дайте примеры использования других функций.
фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
viewtopic.php?f=14&t=13947
- Brook
- Сообщения: 156
- Зарегистрирован: 24 май 2022, 00:29
Вот еще пример. Но если открыть самый первый пост в этом топике, то там будет и код и описание и примеры использования.
Код может немного отличаться, но описание и примеры те же...
Код может немного отличаться, но описание и примеры те же...
Код: Выделить всё
# Сообщение только с текстом и фото
:global teSendPhoto
:local botID "botxxxxxxxxx:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
:local sendText "Any text..."
:local chatID 1234567890
:local image "https://habrastorage.org/webt/kz/uh/xm/kzuhxmsrjq7mrzqin8aznrrhclw.jpeg"
:local messageID [$teSendPhoto fBotID=$botID fChatID=$chatID fPhoto=$imageRoot fText=$sendText]