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

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

Brook писал(а): 10 авг 2023, 12:50
Apollo22 писал(а): 10 авг 2023, 11:50 Приветствую всех.

Так как с версии OS 7.9 поменялся формат вывода даты с (aug/10/2023) на (2023-08-10),
я придумал решение которое будет работать при обоих форматах.
Понимаю что решение не очень но оно работает :-):
 Code

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

:global teGetDate
:if (!any $teGetDate) do={ :global teGetDate do={

    :local date
	:local tmpdate [/system clock get date]
	:local dateformat
	:local tpmpformat [:pick $tmpdate 4]
	:if ($tpmpformat = 1) do={:set dateformat 0} else={:set dateformat 1}
	:if ($dateformat = 0) do={
    :local months {"jan"=1; "feb"=2; "mar"=3; "apr"=4; "may"=5; "jun"=6; "jul"=7; "aug"=8; "sep"=9; "oct"=10; "nov"=11; "dec"=12}
    :local tmpm ($months -> [:pick $tmpdate 0 3])
    :if ($tmpm < 10) do={:set tmpm ("0".$tmpm)
	}
    :return (([:pick $tmpdate 7 11]).".".$tmpm.".".([:pick $tmpdate 4 6]))
	} else={
    :if ($dateformat > 0) do={
        :return ([:pick $tmpdate 0 4].".".[:pick $tmpdate 5 7].".".[:pick $tmpdate 8 10])
    }
	}
  }
}
Не совсем понял вот это

:local tpmpformat [:pick $tmpdate 4]
:if ($tpmpformat = 1) ...

Получается проверяем есть ли на этом месте в строке 1? А если там другая дата?

Наверное надо искать символ "/" и по нему определять формат даты?


upd: Пардон посмотрел не на ту дату. Наверное надо искать символ "-"

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

:local tmpdate [system/clock/get date]; 
:local tpmpformat [:pick $tmpdate 4]; 
:if ($tpmpformat = "-") do={...}
Да вы правы нужно искать символ "/" или "-"
Но при выполнении данной команды :local tpmpformat [:pick $tmpdate 4];
Результат будет число "1" а не знак "/" , поэтому и написал такой костыль.

Но я нашел решение

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

	
	:local tmpdate [system/clock/get date]; 
	:local dateformat
	:local tpmpformat [:pick $tmpdate 0 4]
	:local tpmpformat1 [:pick $tpmpformat 3]
	:if ($tpmpformat1 = "/") do={:set dateformat 0} else={:set dateformat 1}
Так как сейчас два вида формата даты, то определять проще по первому формату (aug/10/2023).
Четвертый знак как раз и будет символ "/"


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

Да вы правы нужно искать символ "/" или "-"
Но при выполнении данной команды :local tpmpformat [:pick $tmpdate 4];
Результат будет число "1" а не знак "/" , поэтому и написал такой костыль.Да вы правы нужно искать символ "/" или "-"
Но при выполнении данной команды :local tpmpformat [:pick $tmpdate 4];
Результат будет число "1" а не знак "/" , поэтому и написал такой костыль.
Команда :pick возвращает подстроку. Если не указано второе значение, то возвращает символ.

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

:local tpmpformat [:pick $tmpdate 4]; 
В данном случае вернет "-", если дата 2023-10-10
Я уже внес исправления в функцию и она прекрасно работает с новой версией.

Кстати, большое спасибо, что обратили на это внимание.


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

Это вам огромное спасибо за данный проект!

Я читал что вы хотите переписать бота для использования нижних кнопок меню (надеюсь правильно их назвал),
очень интересно опробовать данный функционал если он готов.

Так как я изменил пункты меню под себя то я столкнулся с некоторыми неудобствами.
Нет возможности использовать условия для вывода кнопок меню.
Хотел создать меню с настройками бота под конкретную задачу (чтоб не плодить кучу версий бота)
То есть хотел отключать вывод некоторых пунктов меню.
Вторичные меню нормально работают с условиями.

У меня есть надежда что новый формат кнопок меню сможет реагировать на условия.
Я конечно понимаю что мои хотелки не вписываться в концепцию вашего проекта.

Еще раз спасибо вам огромное. :co_ol:


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

 Оригинальное сообщение
Apollo22 писал(а): 13 авг 2023, 11:48 Это вам огромное спасибо за данный проект!

Я читал что вы хотите переписать бота для использования нижних кнопок меню (надеюсь правильно их назвал),
очень интересно опробовать данный функционал если он готов.

Так как я изменил пункты меню под себя то я столкнулся с некоторыми неудобствами.
Нет возможности использовать условия для вывода кнопок меню.
Хотел создать меню с настройками бота под конкретную задачу (чтоб не плодить кучу версий бота)
То есть хотел отключать вывод некоторых пунктов меню.
Вторичные меню нормально работают с условиями.

У меня есть надежда что новый формат кнопок меню сможет реагировать на условия.
Я конечно понимаю что мои хотелки не вписываться в концепцию вашего проекта.

Еще раз спасибо вам огромное. :co_ol:

Да, есть мысли написать новый движок. Только это будут не нижние кнопки, а инлайн меню. Сейчас такая менюшка есть в разделе Terminal.
Если их использовать, то можно организовать принцип одного окна и отказаться от групп и от хранения информации в комментариях самого микротика.

Изображение

Что касается условий, не вижу препятствий.

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

		:local pictScripts "\F0\9F\93\9A"
		:local buttonScripts [$teBuildButton fPictButton=$pictScripts fTextButton="  List of available scripts" fTextCallBack="teCallbackRootMenu,scripts"]

		:local line1 "$buttonAbout"
		:local line2 "$NL$buttonTerminal"
		:local line3 "$NL$buttonSystem"
		:local line4 "$NL$buttonModules"
		:local line5 "$NL$buttonScripts"

		:local line "$line1$line2$line3$line4$line5"
		:local replyMarkup [$teBuildKeyboard fButtonsKeyBoard=$line fReplyKeyboard=false]
Это код из teRootMenu. Последняя строка строит клавиатуру. А перед ней добавляются кнопки. Ничего не мешает создавать кнопки в зависимости от условия и строить клавиатуру из них.


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

А текст функции получения даты получился такой.

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

#---------------------------------------------------teGetDate--------------------------------------------------------------

#   Function returns the current date converted to the format dd.mm.yyyy
#		and returns it in text format

#   No params.

#---------------------------------------------------teGetDate--------------------------------------------------------------

:global teGetDate
:if (!any $teGetDate) do={ :global teGetDate do={

	  :local date
	  :local tmpdate [/system clock get date]
	  :local dateformat [:pick $tmpdate 4]
	  :if ($dateformat != "-") do={
	    :local months {"jan"=1; "feb"=2; "mar"=3; "apr"=4; "may"=5; "jun"=6; "jul"=7; "aug"=8; "sep"=9; "oct"=10; "nov"=11; "dec"=12}
	    :local tmpm ($months -> [:pick $tmpdate 0 3])
	    :if ($tmpm < 10) do={:set tmpm ("0".$tmpm) }
	    :return (([:pick $tmpdate 7 11]).".".$tmpm.".".([:pick $tmpdate 4 6]))
	  } else={
	  	:return ([:pick $tmpdate 8 10].".".[:pick $tmpdate 5 7].".".[:pick $tmpdate 0 4])
	  }
	}
}



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

Хочется вот такое иметь меню
Изображение

В моем случае это обусловлено тем что Mikrotik присылает сообщение о какой либо проблеме.
Сейчас эти оповещения выведены в отдельную группу и это не удобно так как нужно переходить в чат к боту.

Инлайн меню интересно но как по мне не практично, много пунктов меню не очень буду смотреться.
В случае Reply кнопок то можно хоть 3 штуки в ряд сделать.

Если у вас есть наработки как создать эти кнопки то поделитесь пожалуйста.
Заранее спасибо вам.


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

Apollo22 писал(а): 20 авг 2023, 13:14 Хочется вот такое иметь меню
Изображение

В моем случае это обусловлено тем что Mikrotik присылает сообщение о какой либо проблеме.
Сейчас эти оповещения выведены в отдельную группу и это не удобно так как нужно переходить в чат к боту.

Инлайн меню интересно но как по мне не практично, много пунктов меню не очень буду смотреться.
В случае Reply кнопок то можно хоть 3 штуки в ряд сделать.

Если у вас есть наработки как создать эти кнопки то поделитесь пожалуйста.
Заранее спасибо вам.
В папке Library->Interface есть функция создания таких кнопок.

teBuildReplyButton - строит кнопку.У нее три параметра, fPictButton - картинка; fTextButton - текст и fRequestLocation - запрос местоположения.

Если передать функции teBuildKeyboard такую кнопку и установить параметр fReplyKeyboard=true, то из них будет создана клавиатура.

В остальном все так же, как и с обычными кнопками. Создаем клавиатуру, привязываем к сообщению и отправляем. А не используются они в боте потому, что там нельзя прописать Callback и обрабатывать придется в teMessageResponse.

В общем не нашел им применение, но все необходимое для этого есть.

Тут еще надо понимать, что к сообщению можно привязать только одну клавиатуру. Или с обычными кнопками или с reply.
Были эксперименты. Reply привязывал к верхней картинке (это ведь тоже сообщение), а обычную к основному. Не помню чем закончилось, но вроде работало.


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

Brook писал(а): 20 авг 2023, 16:13
Apollo22 писал(а): 20 авг 2023, 13:14 Хочется вот такое иметь меню
Изображение

В моем случае это обусловлено тем что Mikrotik присылает сообщение о какой либо проблеме.
Сейчас эти оповещения выведены в отдельную группу и это не удобно так как нужно переходить в чат к боту.

Инлайн меню интересно но как по мне не практично, много пунктов меню не очень буду смотреться.
В случае Reply кнопок то можно хоть 3 штуки в ряд сделать.

Если у вас есть наработки как создать эти кнопки то поделитесь пожалуйста.
Заранее спасибо вам.
В папке Library->Interface есть функция создания таких кнопок.

teBuildReplyButton - строит кнопку.У нее три параметра, fPictButton - картинка; fTextButton - текст и fRequestLocation - запрос местоположения.

Если передать функции teBuildKeyboard такую кнопку и установить параметр fReplyKeyboard=true, то из них будет создана клавиатура.

В остальном все так же, как и с обычными кнопками. Создаем клавиатуру, привязываем к сообщению и отправляем. А не используются они в боте потому, что там нельзя прописать Callback и обрабатывать придется в teMessageResponse.

В общем не нашел им применение, но все необходимое для этого есть.

Тут еще надо понимать, что к сообщению можно привязать только одну клавиатуру. Или с обычными кнопками или с reply.
Были эксперименты. Reply привязывал к верхней картинке (это ведь тоже сообщение), а обычную к основному. Не помню чем закончилось, но вроде работало.
Это все супер!
Но что-то я не пойму как дальше все связать, прошу не кидаться в меня тапками.
Как обработать сообщение в teMessageResponse?

Можно пример обработки?
Заранее спасибо.


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

Да без проблем.

При нажатии на Reply кнопку, в чат с ботом улетит текстовое сообщение, которое в этой кнопке прописано. Это сообщение попадет в модуль teMessageResponse.

Если откроете сам модуль, то в нем, после объявления всех переменных идут проверки условий. Например:

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

	:if ($messageText~"start") do={
		:if ([$teRightsControl fMethod=get fGroupID=$userChatID fRightName=root]) do={
			$teRootMenu fChatID=$userChatID
			:return true
		}
	}

В данном случае мы проверяем текст сообщения и если это start, то запускаем на выполнение модуль $teRootMenu. Это первое условие в модуле, которое отвечает за реакцию на команду start. Рекомендую добавлять свой код после этого блока.


Если добавить в teMessageResponse свой блок с условием, то он выполнится. К примеру в Reply кнопке зашит текст "Hello"...

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

	:if ($messageText~"Hello") do={
		:set messageID [$teSendMessage fChatID=$queryChatID fText="Hi, am mikRobot"]
		:return true
	}

... в ответ прилетит сообщение Hi, am mikRobot. Тоже самое произойдет, если просто отправить сообщение Hello.

В этом блоке уже может быть Ваш код, какой пожелаете...

Надеюсь понятно объяснил. У меня бывают с этим проблемы.


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

Brook писал(а): 22 авг 2023, 20:20 Да без проблем.

При нажатии на Reply кнопку, в чат с ботом улетит текстовое сообщение, которое в этой кнопке прописано. Это сообщение попадет в модуль teMessageResponse.

Если откроете сам модуль, то в нем, после объявления всех переменных идут проверки условий. Например:

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

	:if ($messageText~"start") do={
		:if ([$teRightsControl fMethod=get fGroupID=$userChatID fRightName=root]) do={
			$teRootMenu fChatID=$userChatID
			:return true
		}
	}

В данном случае мы проверяем текст сообщения и если это start, то запускаем на выполнение модуль $teRootMenu. Это первое условие в модуле, которое отвечает за реакцию на команду start. Рекомендую добавлять свой код после этого блока.


Если добавить в teMessageResponse свой блок с условием, то он выполнится. К примеру в Reply кнопке зашит текст "Hello"...

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

	:if ($messageText~"Hello") do={
		:set messageID [$teSendMessage fChatID=$queryChatID fText="Hi, am mikRobot"]
		:return true
	}

... в ответ прилетит сообщение Hi, am mikRobot. Тоже самое произойдет, если просто отправить сообщение Hello.

В этом блоке уже может быть Ваш код, какой пожелаете...

Надеюсь понятно объяснил. У меня бывают с этим проблемы.
Большое спасибо за подсказки. :co_ol:
Теперь стало намного интереснее. :ya_hoo_oo:
Как сделаю что-то более менее рабочее то обязательно покажу.


Ответить