Re: еще один telegram bot
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