Телеграмма для Mikrotik...

Здесь выкладываем скрипты
Правила форума
Уважаемые Пользователи форума, обратите внимание!
Ни при каких обстоятельствах, Администрация форума, не несёт ответственности за какой-либо, прямой или косвенный, ущерб причиненный в результате использования материалов, взятых на этом Сайте или на любом другом сайте, на который имеется гиперссылка с данного Сайта. Возникновение неисправностей, потерю программ или данных в Ваших устройствах, даже если Администрация будет явно поставлена в известность о возможности такого ущерба.
Просим Вас быть предельно осторожными и внимательными, в использовании материалов раздела. Учитывать не только Ваши пожелания, но и границы возможностей вашего оборудования.
Ответить
Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Рад помочь. Будет очень интересно посмотреть!


Apollo22
Сообщения: 21
Зарегистрирован: 05 ноя 2022, 21:27

Прошу помощи с решением задачи

Использую такой код в 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
		}
	}
Из ваших подсказок я понял как отрабатывать запросы на нажатие Reply кнопки.
Была нажата кнопка "Status Router" и получен ответ $teSystemMenu
Допустим дальше нажал кнопку "Modules" и получил ответ $teModules.
Есть ли возможность удалять предыдущие ответы бота с чата?
Как текст удалять я разобрался а вот как удалять предыдущие сообщения увы нет.

Надеюсь я еще не надоел вам своими просьбами.
Заранее спасибо.


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

В этом и недостаток таких кнопок. Сложно реализовать принцип одного окна. При нажатии обычной кнопки под сообщением, мы в колбэке получаем ИД этого сообщения и можем его редактировать.

А в случае с reply кнопками мы получаем номер того сообщения, которое в кнопке зашито. С остальными сделать ничего не можем. Только если записывать номера всех отправленных сообщений, но это тот еще гемор.


Apollo22
Сообщения: 21
Зарегистрирован: 05 ноя 2022, 21:27

Brook писал(а): 29 авг 2023, 22:21 В этом и недостаток таких кнопок. Сложно реализовать принцип одного окна. При нажатии обычной кнопки под сообщением, мы в колбэке получаем ИД этого сообщения и можем его редактировать.

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

Если интересно могу скинуть код, только там ужас :hi_hi_hi:


Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Коллеги, прочитал в одном из топиков, что мой код сложный для понимания. Если рассматривать его в целом, то да, наверное. Там логика не простая. Но если его расслоить, то получается не сильно сложно.

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

Изображение

Наверное, опубликую их отдельно вместе с описанием использования. Разворачивать можно отдельно каждую, по необходимости.

upd: Инсталлятор тоже будет.


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Вот это стоящее дело ! ждём !


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Apollo22
Сообщения: 21
Зарегистрирован: 05 ноя 2022, 21:27

Не знаю на сколько это будет полезно но опубликую свои доработки
Эти скрипты нужны при использовании 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

Код: Выделить всё

#---------------------------------------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)
}
}
}
}
И часть кода для teMessageResponse

Код: Выделить всё

	
	: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
Сообщения: 127
Зарегистрирован: 24 май 2022, 00:29

Друзья, выделил функции Телеги в отдельные файлы.

Их можно развернуть командой import и использовать отдельно.

Код: Выделить всё

import file-name=teMessages.rsc
import file-name=teInterface.rsc
Например для отправки сообщения:

Код: Выделить всё

:put [$teSendMessage fBotID=$botID fChatID=$chatID fText="Test Text"]
Результатом работы функции будет номер сообщения.

Код опубликовал в Телеграм-канале.


Sertik
Сообщения: 1601
Зарегистрирован: 15 сен 2017, 09:03

Дайте примеры использования других функций.


фрагменты скриптов, готовые работы, статьи, полезные приемы, ссылки
viewtopic.php?f=14&t=13947
Аватара пользователя
Brook
Сообщения: 127
Зарегистрирован: 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]


Ответить