diff options
Diffstat (limited to 'rhnop-server/qlistener.lua')
-rwxr-xr-x | rhnop-server/qlistener.lua | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/rhnop-server/qlistener.lua b/rhnop-server/qlistener.lua new file mode 100755 index 0000000..8f2c0e2 --- /dev/null +++ b/rhnop-server/qlistener.lua @@ -0,0 +1,89 @@ +-- +-- rhnop +-- +-- Copyright (C) 2011 Christian Pointner <equinox@helsinki.at> +-- +-- This file is part of rhnop. +-- +-- rhnop is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation, either version 3 of the License, or +-- any later version. +-- +-- rhnop is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with rhnop. If not, see <http://www.gnu.org/licenses/>. +-- + +local last_cart = nil + +mq = require "mq" +playlog = require "playlog" +rddb = require "rddb" +conf = require "conf" + +function handle_now(timestamp, nowcart, nowlen) + local results, err = rddb:getCartInfo(nowcart); + if results == nil then + io.stderr:write("can't fetch cart info: " .. err .. "\n") + else +-- print(timestamp .. " Info: '" .. results.TITLE .. "' von '" .. results.ARTIST .. "' aus '" .. results.ALBUM .. "'") + local ret, err = playlog:insertNowMusic(timestamp, nowcart, nowlen, results.TITLE, results.ARTIST, results.ALBUM) + if ret == nil then + io.stderr:write("can't insert music info: " .. err .. "\n") + else + pipe.signal(timestamp) + end + end +end + +function handle_message(msg) + local timestamp, nowcart, nowlen, nextcart, nextlen = string.match(msg, "^(%d+) (%d+) (%d+) (%d+) (%d+)$"); + if not timestamp or not nowcart or not nowlen or not nextcart or not nextlen then + io.stderr:write("ignoring malformed message\n") + else + -- TODO better sanity checks: is now info new or just next? + if last_cart ~= nowcart then + last_cart = nowcart + handle_now(timestamp, nowcart, nowlen) + end + -- TODO handle next info + end +end + +function main_loop() + local q, err = mq.create(conf.queue_name, "ro") + if q == nil then + io.stderr:write("creation of message queue failed: " .. err .. "\n") + os.exit(1) + end + + local ret, err = playlog:init() + if ret == nil then + io.stderr:write("creation of playlog failed: " .. err .. "\n") + os.exit(1) + end + last_cart = assert(playlog:getLastCart()) + + local ret, err = rddb:init() + if ret == nil then + io.stderr:write("opening rivendell db failed: " .. err .. "\n") + playlog:close() + os.exit(1) + end + + while true do + local msg, prio = mq.receive(q) + if msg == nil then + io.stderr:write("recv error: " .. prio .. "\n") + rddb:close() + playlog:close() + os.exit(2) + end + handle_message(msg) + end +end
\ No newline at end of file |