<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[QUIK -> DDE &mdash; еще один telegram bot]]></title>
		<link>https://quik2dde.ru/viewtopic.php?id=307</link>
		<atom:link href="https://quik2dde.ru/extern.php?action=feed&amp;tid=307&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «еще один telegram bot».]]></description>
		<lastBuildDate>Sun, 07 Nov 2021 07:24:19 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3358#p3358</link>
			<description><![CDATA[<p>Добрый день. </p><p>Есть ли возможность проверить в скрипте quik_telegram_agent.lua отправилось ли сообщение в телеграм бот или нет? Хотелось бы сделать проверку и по её результатам из quik_telegram_agent.lua выполнять определённые действия на графике.</p>]]></description>
			<author><![CDATA[null@example.com (klmmn)]]></author>
			<pubDate>Sun, 07 Nov 2021 07:24:19 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3358#p3358</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3316#p3316</link>
			<description><![CDATA[<p>до чего же вас легко удивить</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Fri, 02 Jul 2021 17:32:08 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3316#p3316</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3313#p3313</link>
			<description><![CDATA[<div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>Этот бот - демонстрация возможностей библиотеки 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. Все это собрано вместе для удобства.</p><p>Бот позволяет пользователям telegram, в частности, хозяину бота, передавать команды нескольким одновременно запущенным терминалам quik версий 7 и 8, программировать в этих терминалах реакцию на команды. При этом сам скрипт, в котором терминал quik передает и получает сообщения предельно прост и занимает несколько строк.</p><p>Бот состоит из скрипта-агента quik_telegram_agent.lua, который запускается в терминалах quik и в котором программируется реакция на команды пользователей и &quot;брокера&quot; - отдельного приложения ipc_telegram_bot.exe, которое аутентифицирует пользователей telegram и маршрутизирует сообщения от пользователей терминалам quik и обратно. Поддерживается общение точка-точка и широковещательные сообщения.</p><p>Установка:<br />------------</p><p>[s]1. Зарегистрировать telegram bot, получить его token.</p><p>2. Token следует прописать в файле ipc_telegram_bot.lua: в первой строке присвоить переменной telegram_bot_token строковое значение, соответствующее токену.<br />&nbsp; &nbsp;<br />3. Запустить ipc_telegram_bot.exe</p><p>4. Запустить quik, предварительно положив в него файлы из каталога quik.</p><p>5. Запустить в quik агент quik_telegram_agent.lua</p><p>Взаимодействие с ботом:<br />-----------------------------</p><p>Если в телеграме подключиться к боту и послать в него &quot;hello&quot;, то пользователь становится &quot;залогинен&quot; (для секурности слово &quot;hello&quot; можно заменить на какой-то уникальный пароль). После этого, все сообщения будут транслироваться во все терминалы quik, в которых запущен скрипт quik_telegram_agent.lua. </p><p>Каждый из этих терминалов будет отвечать пользователю на его сообщение сообщением &quot;received: &lt;сообщение пользователя&gt;&quot;, а так же выводить id пользователя и текст сообщения в таблицу &quot;системные сообщения&quot;. Кроме того, терминалы будут рассылать всем &quot;залогиненным&quot; клиентам статус своего соединения. </p><p>Это просто демонстрационный пример. Ничего &quot;полезного&quot; кроме рассылки статуса соединения quik_telegram_agent.lua не делает. Пользователь должен сам запрограммировать желаемое поведение бота.</p><p>Дистрибутив:<br />---------------<br />[url]https://www.dropbox.com/s/852tk2yoif56w8o/telegram_bot_binaries_x64.zip?dl=0[/url]</p></blockquote></div><p>Хочу выразить свое восхищение. Это просто супер!</p>]]></description>
			<author><![CDATA[null@example.com (bobroff)]]></author>
			<pubDate>Thu, 01 Jul 2021 05:14:37 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3313#p3313</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3244#p3244</link>
			<description><![CDATA[<p>так ли вам нужна лента новостей? выкиньте поллинг окна новости вместе с multilist, вместо этого сделайте то, что вам действительно нужно.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Fri, 11 Jun 2021 14:26:55 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3244#p3244</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3243#p3243</link>
			<description><![CDATA[<div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>у вас запущен параллельно какой-то другой скрипт типа &quot;авто-логин&quot; или что-то подобное? возможно, они конфликтуют.</p></blockquote></div><p>и не один...</p>]]></description>
			<author><![CDATA[null@example.com (Skyspirit)]]></author>
			<pubDate>Fri, 11 Jun 2021 13:23:40 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3243#p3243</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3242#p3242</link>
			<description><![CDATA[<p>у вас запущен параллельно какой-то другой скрипт типа &quot;авто-логин&quot; или что-то подобное? возможно, они конфликтуют.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Fri, 11 Jun 2021 13:09:23 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3242#p3242</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3238#p3238</link>
			<description><![CDATA[<div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>если оборвался коннект квика к брокеру - откуда новые новости возьмутся? повисает скрипт в квике? завершается с ошибкой скрипт в квике? завершается с ошибкой lua_telegram_bot.exe? в консоль телеграм-бота новые команды из телеграма приходят?</p></blockquote></div><p>если оборвался коннект квика к брокеру - откуда новые новости возьмутся? - Реконнект и новости посыпались дальше, но этого не происходит, в консоли отображается только последняя новость до обрыва соединения.<br />повисает скрипт в квике? - да, вместе с квиком, если перезапустить его после того, как перестает реагировать на сообщения. <br />в консоль телеграм-бота новые команды из телеграма приходят? - да, без реакции на них.</p>]]></description>
			<author><![CDATA[null@example.com (Skyspirit)]]></author>
			<pubDate>Fri, 11 Jun 2021 10:52:15 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3238#p3238</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3221#p3221</link>
			<description><![CDATA[<p>если оборвался коннект квика к брокеру - откуда новые новости возьмутся? повисает скрипт в квике? завершается с ошибкой скрипт в квике? завершается с ошибкой lua_telegram_bot.exe? в консоль телеграм-бота новые команды из телеграма приходят?</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Thu, 10 Jun 2021 11:56:21 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3221#p3221</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3220#p3220</link>
			<description><![CDATA[<div class="quotebox"><cite>toxa пишет:</cite><blockquote><div class="codebox"><pre><code>function OnOrder(order)
    if orders_poll_enabled then
        tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, message = &quot;Order: &quot; .. tostring(order.order_num)}
    end
end</code></pre></div><p>ну, естественно, вместо &quot;Order: &quot; .. tostring(order.order_num) нужно преобразование в строку и конкатенация тех полей из таблицы &quot;заявки&quot;, которые вас интересуют.</p><p>аналогично можно транслировать сделки, позы, все что доступно через lua-колбэки в квике.</p><p>ps: я догадываюсь, почему у вас не работает, но я не буду указывать на проблему, потому что гораздо лучше использовать те методы, которые для этого предназначены. о том, какие есть колбэки, кроме OnOrder и OnTrade, можно почитать в документации по quik lua, которая есть в дистрибутиве квика.<br />pps: нельзя же настолько бездумно копировать. что у вас в таблице заявки row[5]? вы уверены, что там номер заявки? к тому же, в отличие от таблицы &quot;новости&quot;, в таблице &quot;заявки&quot; обновляются произвольные строки, а этот алгоритм будет работать только с таблицей, у которой новые строки добавляются в начало, а сами строки, будучи добавленными, остаются неизменны.</p></blockquote></div><p>Спасибо за комментарий, вот и изучаю как могу...<br />видимо, я что-то не в полной мере хорошо сделал, так как новости перестают приходить при обрыве соединения или по иному своему усмотрению. Работает, потом перестает сервер отвечать на сообщения. </p><div class="codebox"><pre><code>package.cpath = getScriptPath() .. &quot;/?.dll&quot;
sh = require &quot;lua_share&quot;

function table.val_to_str ( v )
    if &quot;string&quot; == type( v ) then
        v = string.gsub( v, &quot;\n&quot;, &quot;\\n&quot; )
        if string.match( string.gsub(v,&quot;[^&#039;\&quot;]&quot;,&quot;&quot;), &#039;^&quot;+$&#039; ) then
            return &quot;&#039;&quot; .. v .. &quot;&#039;&quot;
        end
        return &#039;&quot;&#039; .. string.gsub(v,&#039;&quot;&#039;, &#039;\\&quot;&#039; ) .. &#039;&quot;&#039;
    end
    return &quot;table&quot; == type( v ) and table.tostring( v ) or tostring( v )
end
function table.key_to_str ( k )
    if &quot;string&quot; == type( k ) and string.match( k, &quot;^[_%a][_%a%d]*$&quot; ) then
        return k
    end
    return &quot;[&quot; .. table.val_to_str( k ) .. &quot;]&quot;
end
function table.tostring( tbl )
    if type(tbl)~=&#039;table&#039; 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 ) .. &quot;=&quot; .. table.val_to_str( v ) )
        end
    end
    return &quot;{&quot; .. table.concat( result, &quot;,&quot; ) .. &quot;}&quot;
end

QUIK_connection_status = {[0]=&quot;DISCONNECTED&quot;, [1]=&quot;CONNECTED&quot;}

tsq = sh.GetIPCNameSpace(&quot;queues&quot;) -- get predefined &quot;queues&quot; namespace
trq = sh.GetIPCNameSpace(&quot;fixed_queues&quot;)

current_quik_id = getWorkingFolder()

function sendconnectionstatus()
    tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, message = &quot;QUIK: &quot; .. current_quik_id .. &quot; &quot; .. QUIK_connection_status[isConnected()]}
end
-- Пишем обработчики 
ml = require &quot;lua_multilist&quot;
last_news_id = nil
function sendnews()
    if news_table_handle == nil then news_table_handle = ml.find_table(&#039;\205\238\226\238\241\242\232&#039;) end -- &quot;Новости&quot; 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[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, message = row[2] .. &quot; &quot; .. row[3] .. &quot;: &quot; .. row[4]}
                    if (i &gt;= 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 &gt;= 5) then
            -- ping quik connection
            tsq[&quot;telegram_queue&quot;] = {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[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = &quot;received: &quot; .. 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 == &#039;news start&#039; then
                                news_poll_enabled = true
                                tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, user_id = data.user_id, message = &quot;news polling started&quot;}
                            elseif command == &#039;news stop&#039; then
                                news_poll_enabled = false
                                tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, user_id = data.user_id, message = &quot;news polling stopped&quot;}
                            else
                                -- reply message back to telegram user
                                tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, quik_alive = true, user_id = data.user_id, message = &quot;received: &quot; .. tostring(data.message)}
                                -- dump message to messages table
                                message(&quot;user: &quot; .. tostring(data.user_id) .. &quot; message: &quot; .. tostring(data.message), 1)
                            end
                        end
        until data == nil
        sleep(100)
    end
    -- unsubscribe
    tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id}
end

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

function OnDisconnected()
  sendconnectionstatus()
end

function OnStop()
    exitflag = true
end</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Skyspirit)]]></author>
			<pubDate>Thu, 10 Jun 2021 11:27:01 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3220#p3220</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3205#p3205</link>
			<description><![CDATA[<div class="codebox"><pre><code>function OnOrder(order)
    if orders_poll_enabled then
        tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, message = &quot;Order: &quot; .. tostring(order.order_num)}
    end
end</code></pre></div><p>ну, естественно, вместо &quot;Order: &quot; .. tostring(order.order_num) нужно преобразование в строку и конкатенация тех полей из таблицы &quot;заявки&quot;, которые вас интересуют.</p><p>аналогично можно транслировать сделки, позы, все что доступно через lua-колбэки в квике.</p><p>ps: я догадываюсь, почему у вас не работает, но я не буду указывать на проблему, потому что гораздо лучше использовать те методы, которые для этого предназначены. о том, какие есть колбэки, кроме OnOrder и OnTrade, можно почитать в документации по quik lua, которая есть в дистрибутиве квика.<br />pps: нельзя же настолько бездумно копировать. что у вас в таблице заявки row[5]? вы уверены, что там номер заявки? к тому же, в отличие от таблицы &quot;новости&quot;, в таблице &quot;заявки&quot; обновляются произвольные строки, а этот алгоритм будет работать только с таблицей, у которой новые строки добавляются в начало, а сами строки, будучи добавленными, остаются неизменны.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Fri, 04 Jun 2021 09:32:19 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3205#p3205</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3204#p3204</link>
			<description><![CDATA[<div class="quotebox"><cite>Skyspirit пишет:</cite><blockquote><div class="codebox"><pre><code>    if orders_table_handle == nil then news_table_handle = ml.find_table(&#039;Заявки&#039;) end -- &quot;Заявки&quot; window caption
    if orders_table_handle ~= nil then</code></pre></div><p>Почему не отправляет?</p></blockquote></div><p>ЗАЧЕМ? есть же штатный механизм получения заявок через колбэк.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Thu, 03 Jun 2021 16:48:44 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3204#p3204</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3203#p3203</link>
			<description><![CDATA[<div class="quotebox"><cite>Skyspirit пишет:</cite><blockquote><p>и ещё такой момент: если закрыть ipc_telegram_bot.exe , то слетают подписки, приходится опять hello, start news ...</p></blockquote></div><p>да, естественно, они же в этом процессе хранятся. можно использовать permanent хранилище, а можно просто никогда его не выключать - он ресурсов вообще нисколько не требует.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Thu, 03 Jun 2021 16:46:52 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3203#p3203</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3202#p3202</link>
			<description><![CDATA[<p>и ещё такой момент: если закрыть ipc_telegram_bot.exe , то слетают подписки, приходится опять hello, start news ...</p>]]></description>
			<author><![CDATA[null@example.com (Skyspirit)]]></author>
			<pubDate>Wed, 02 Jun 2021 19:19:48 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3202#p3202</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3201#p3201</link>
			<description><![CDATA[<div class="quotebox"><cite>toxa пишет:</cite><blockquote><p>почему демонстрация трансляции сделана именно из таблицы новости - потому, что из таблицы новости нельзя сделать никакой экспорт, она так же недоступна для qpile/lua. это сделано специально, чтобы не воровали новости и не транслировали их на свои сайты или куда там еще.</p></blockquote></div><p>Пытаюсь собрать отправку &quot;Заявок&quot;</p><p>Обработчик<br /></p><div class="codebox"><pre><code>-- Orders
function sendorders()
    if orders_table_handle == nil then news_table_handle = ml.find_table(&#039;Заявки&#039;) end -- &quot;Заявки&quot; window caption
    if orders_table_handle ~= nil then
        local i = 1
        local id = nil
        repeat
            local row = ml.get_row(orders_table_handle, i)
            if row ~= nil then
                if id == nil then id = row[5] end
                if last_orders_id ~= row[5] then 
                    tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, message = row[2] .. &quot; &quot; .. row[3] .. &quot;: &quot; .. row[4]}
                    if (i &gt;= 1) then row = nil end
                else
                    row = nil                
                end
                i = i + 1
            end 
        until row == nil
        if id ~= nil then last_orders_id = id end
    end
end</code></pre></div><p>запуск функции<br /></p><div class="codebox"><pre><code>-- orders
            if (os.time() - last_os_time &gt;= 5) then
            else if orders_poll_enabled then sendorders() 
            end 
            end</code></pre></div><p>Подписка на завки<br /></p><div class="codebox"><pre><code>            if data ~= nil then
                            local command = data.message:lower()
                           if command == &#039;orders start&#039; then
                                orders_poll_enabled = true
                                tsq[&quot;telegram_queue&quot;] = {quik_id = current_quik_id, user_id = data.user_id, message = &quot;orders polling started&quot;}
                            
                            end
                        end
        until data == nil
        sleep(100)
    end</code></pre></div><p>Почему не отправляет?</p>]]></description>
			<author><![CDATA[null@example.com (Skyspirit)]]></author>
			<pubDate>Wed, 02 Jun 2021 18:40:33 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3201#p3201</guid>
		</item>
		<item>
			<title><![CDATA[Re: еще один telegram bot]]></title>
			<link>https://quik2dde.ru/viewtopic.php?pid=3193#p3193</link>
			<description><![CDATA[<p>почему демонстрация трансляции сделана именно из таблицы новости - потому, что из таблицы новости нельзя сделать никакой экспорт, она так же недоступна для qpile/lua. это сделано специально, чтобы не воровали новости и не транслировали их на свои сайты или куда там еще.</p>]]></description>
			<author><![CDATA[null@example.com (toxa)]]></author>
			<pubDate>Wed, 02 Jun 2021 14:21:57 +0000</pubDate>
			<guid>https://quik2dde.ru/viewtopic.php?pid=3193#p3193</guid>
		</item>
	</channel>
</rss>
