51

Re: еще один telegram bot

toxa пишет:
function OnOrder(order)
    if orders_poll_enabled then
        tsq["telegram_queue"] = {quik_id = current_quik_id, message = "Order: " .. tostring(order.order_num)}
    end
end

ну, естественно, вместо "Order: " .. tostring(order.order_num) нужно преобразование в строку и конкатенация тех полей из таблицы "заявки", которые вас интересуют.

аналогично можно транслировать сделки, позы, все что доступно через lua-колбэки в квике.

ps: я догадываюсь, почему у вас не работает, но я не буду указывать на проблему, потому что гораздо лучше использовать те методы, которые для этого предназначены. о том, какие есть колбэки, кроме OnOrder и OnTrade, можно почитать в документации по quik lua, которая есть в дистрибутиве квика.
pps: нельзя же настолько бездумно копировать. что у вас в таблице заявки row[5]? вы уверены, что там номер заявки? к тому же, в отличие от таблицы "новости", в таблице "заявки" обновляются произвольные строки, а этот алгоритм будет работать только с таблицей, у которой новые строки добавляются в начало, а сами строки, будучи добавленными, остаются неизменны.

Спасибо за комментарий, вот и изучаю как могу...
видимо, я что-то не в полной мере хорошо сделал, так как новости перестают приходить при обрыве соединения или по иному своему усмотрению. Работает, потом перестает сервер отвечать на сообщения.

package.cpath = getScriptPath() .. "/?.dll"
sh = require "lua_share"

function table.val_to_str ( v )
    if "string" == type( v ) then
        v = string.gsub( v, "\n", "\\n" )
        if string.match( string.gsub(v,"[^'\"]",""), '^"+$' ) then
            return "'" .. v .. "'"
        end
        return '"' .. string.gsub(v,'"', '\\"' ) .. '"'
    end
    return "table" == type( v ) and table.tostring( v ) or tostring( v )
end
function table.key_to_str ( k )
    if "string" == type( k ) and string.match( k, "^[_%a][_%a%d]*$" ) then
        return k
    end
    return "[" .. table.val_to_str( k ) .. "]"
end
function table.tostring( tbl )
    if type(tbl)~='table' then return table.val_to_str(tbl) end
    local result, done = {}, {}
    for k, v in ipairs( tbl ) do
        table.insert( result, table.val_to_str( v ) )
        done[ k ] = true
    end
    for k, v in pairs( tbl ) do
        if not done[ k ] then
            table.insert( result, table.key_to_str( k ) .. "=" .. table.val_to_str( v ) )
        end
    end
    return "{" .. table.concat( result, "," ) .. "}"
end

QUIK_connection_status = {[0]="DISCONNECTED", [1]="CONNECTED"}

tsq = sh.GetIPCNameSpace("queues") -- get predefined "queues" namespace
trq = sh.GetIPCNameSpace("fixed_queues")

current_quik_id = getWorkingFolder()

function sendconnectionstatus()
    tsq["telegram_queue"] = {quik_id = current_quik_id, message = "QUIK: " .. current_quik_id .. " " .. QUIK_connection_status[isConnected()]}
end
-- Пишем обработчики 
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 >= 1) 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

-- конец кода обработчиков 
function main()
    local last_os_time = 0

    -- send QUIK connection status
    sendconnectionstatus()

    -- process
    while not exitflag do
        if (os.time() - last_os_time >= 5) then
            -- ping quik connection
            tsq["telegram_queue"] = {quik_id = current_quik_id, quik_alive = true}        
            last_os_time = os.time()
            else if news_poll_enabled then sendnews()
            end
        end
        repeat
            local data = trq[current_quik_id]
            if data ~= nil then
                -- reply message back to user
                tsq["telegram_queue"] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = "received: " .. tostring(data.message)}
                -- dump message to messages table
                message(table.tostring(data), 1)
            end
            if data ~= nil then
                            local command = data.message:lower()
                            if command == 'news start' then
                                news_poll_enabled = true
                                tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "news polling started"}
                            elseif command == 'news stop' then
                                news_poll_enabled = false
                                tsq["telegram_queue"] = {quik_id = current_quik_id, user_id = data.user_id, message = "news polling stopped"}
                            else
                                -- reply message back to telegram user
                                tsq["telegram_queue"] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = "received: " .. tostring(data.message)}
                                -- dump message to messages table
                                message("user: " .. tostring(data.user_id) .. " message: " .. tostring(data.message), 1)
                            end
                        end
        until data == nil
        sleep(100)
    end
    -- unsubscribe
    tsq["telegram_queue"] = {quik_id = current_quik_id}
end

function OnConnected(flag)
  if flag then sendconnectionstatus(); end  
end

function OnDisconnected()
  sendconnectionstatus()
end

function OnStop()
    exitflag = true
end

52

Re: еще один telegram bot

если оборвался коннект квика к брокеру - откуда новые новости возьмутся? повисает скрипт в квике? завершается с ошибкой скрипт в квике? завершается с ошибкой lua_telegram_bot.exe? в консоль телеграм-бота новые команды из телеграма приходят?

53

Re: еще один telegram bot

toxa пишет:

если оборвался коннект квика к брокеру - откуда новые новости возьмутся? повисает скрипт в квике? завершается с ошибкой скрипт в квике? завершается с ошибкой lua_telegram_bot.exe? в консоль телеграм-бота новые команды из телеграма приходят?

если оборвался коннект квика к брокеру - откуда новые новости возьмутся? - Реконнект и новости посыпались дальше, но этого не происходит, в консоли отображается только последняя новость до обрыва соединения.
повисает скрипт в квике? - да, вместе с квиком, если перезапустить его после того, как перестает реагировать на сообщения.
в консоль телеграм-бота новые команды из телеграма приходят? - да, без реакции на них.

54

Re: еще один telegram bot

у вас запущен параллельно какой-то другой скрипт типа "авто-логин" или что-то подобное? возможно, они конфликтуют.

55

Re: еще один telegram bot

toxa пишет:

у вас запущен параллельно какой-то другой скрипт типа "авто-логин" или что-то подобное? возможно, они конфликтуют.

и не один...

56

Re: еще один telegram bot

так ли вам нужна лента новостей? выкиньте поллинг окна новости вместе с multilist, вместо этого сделайте то, что вам действительно нужно.

57

Re: еще один telegram bot

toxa пишет:

Этот бот - демонстрация возможностей библиотеки 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 и обратно. Поддерживается общение точка-точка и широковещательные сообщения.

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

[s]1. Зарегистрировать telegram bot, получить его token.

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

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

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

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

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

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

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

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

Хочу выразить свое восхищение. Это просто супер!

58

Re: еще один telegram bot

до чего же вас легко удивить