1 (2019-12-04 00:36:35 отредактировано toxa)

Тема: еще один telegram bot

Этот бот - демонстрация возможностей библиотеки lua_share. Кроме нее, весь код бота написан на lua (за исключением сокетов, json и ssl - все это opensource C + lua библиотеки). ipc_telegram_bot.exe - это переименованный 32-х битный lua_share_server.exe из дистрибутива lua_share. Lua5.1.dll - из дистрибутива lua 5.1.5; libeay32.dll ssleay32.dll - из дистрибутива OpenSSL. Все это собрано вместе для удобства.

Бот позволяет пользователям telegram, в частности, хозяину бота, передавать команды нескольким одновременно запущенным терминалам quik версий 7 и 8, программировать в этих терминалах реакцию на команды. При этом сам скрипт, в котором терминал quik передает и получает сообщения предельно прост и занимает несколько строк.

Бот состоит из скрипта-агента quik_telegram_agent.lua, который запускается в терминалах quik и в котором программируется реакция на команды пользователей и "брокера" - отдельного приложения ipc_telegram_bot.exe, которое аутентифицирует пользователей telegram и маршрутизирует сообщения от пользователей терминалам quik и обратно. Поддерживается общение точка-точка и широковещательные сообщения.

Установка:
------------

1. Положить библиотеки lua5.1.dll, QCtrls.dll, qlist.dll, qlua.dll из дистрибутива quik7 в папку x86_ipc_telegram_bot. Можно взять lua5.1.dll из 32-битного дистрибутива lua 5.1, тогда QCtrls.dll, qlist.dll, qlua.dll не нужны.
   
2. Зарегистрировать telegram bot, получить его token.

3. Token следует прописать в файле ipc_telegram_bot.lua: в первой строке присвоить переменной telegram_bot_token строковое значение, соответствующее токену.
   
4. Запустить ipc_telegram_bot.exe

5. Запустить quik, предварительно положив в него файлы из каталога quik7 или quik8, в зависимости от версии.

6. Запустить в quik агент quik_telegram_agent.lua

Взаимодействие с ботом:
-----------------------------

Если в телеграме подключиться к боту и послать в него "hello", то пользователь становится "залогинен" (для секурности слово "hello" можно заменить на какой-то уникальный пароль). После этого, все сообщения будут транслироваться во все терминалы quik, в которых запущен скрипт quik_telegram_agent.lua.

Каждый из этих терминалов будет отвечать пользователю на его сообщение сообщением "received: <сообщение пользователя>", а так же выводить id пользователя и текст сообщения в таблицу "системные сообщения". Кроме того, терминалы будут рассылать всем "залогиненным" клиентам статус своего соединения.

Это просто демонстрационный пример. Ничего "полезного" кроме рассылки статуса соединения quik_telegram_agent.lua не делает. Пользователь должен сам запрограммировать желаемое поведение бота.

Дистрибутив:
---------------
https://www.dropbox.com/s/qm746ml4xl98g … s.zip?dl=0

2 (2019-12-04 19:25:55 отредактировано toxa)

Re: еще один telegram bot

Поправил немножко кодировки, сделал перекодирование в utf8 в ansi и обратно, так как в quik родная кодировка все же ansi.

можно сделать отправку новостей в телеграм из окна "новости". quik_telegram_agent.lua между функциями sendconnectionstatus() и main() я добавил следующий код:

ml = require "lua_multilist"
last_news_id = nil
function sendnews()
    if news_table_handle == nil then news_table_handle = ml.find_table('\205\238\226\238\241\242\232') end -- "Новости" window caption
    if news_table_handle ~= nil then
        local i = 1
        local id = nil
        repeat
            local row = ml.get_row(news_table_handle, i)
            if row ~= nil then
                if id == nil then id = row[5] end
                if last_news_id ~= row[5] then 
                    tsq["telegram_queue"] = {quik_id = current_quik_id, message = row[2] .. " " .. row[3] .. ": " .. row[4]}
                    if (i >= 15) then row = nil end
                else
                    row = nil                
                end
                i = i + 1
            end 
        until row == nil
        if id ~= nil then last_news_id = id end
    end
end

и в main() я добавил вызов этой функции раз в 5 секунд, в блок условия, где комментарий "-- ping quik connection every 5 seconds..." эта функция проверяет окно "Новости" на появление новых строк сверху, и отправляет 15 новых новостей, или меньше, если появилось меньше. проверка производится по значению поля "Номер", куда quik записывает уникальный номер новости.
в настройках окна "Новости" (ctrl-E) нужно убрать галку "показывать статистику", так как ml.find_table() не умеет искать в заголовках окон по маске.

библиотека lua_multilist тут: https://www.dropbox.com/s/oz29t9wxygryo … s.zip?dl=0