local message = redis.call("ZRANGE", KEYS[1], "-inf", KEYS[2], "BYSCORE", "LIMIT", 0, 1)
if #message == 0 then
return { false, "", "", 0, 0 }
end
local should_delete = ARGV[1] == "true"
local messageBody = redis.call("HGET", KEYS[1] .. ":Q", message[1])
if not messageBody then
return { false, "", "", 0, 0 }
end
redis.call("HINCRBY", KEYS[1] .. ":Q", "totalrecv", 1)
local receiveCount = redis.call("HINCRBY", KEYS[1] .. ":Q", message[1] .. ":rc", 1)
local response = { true, message[1], messageBody, receiveCount }
if receiveCount == 1 then
redis.call("HSET", KEYS[1] .. ":Q", message[1] .. ":fr", KEYS[2])
table.insert(response, KEYS[2])
else
local firstReceived = redis.call("HGET", KEYS[1] .. ":Q", message[1] .. ":fr")
table.insert(response, firstReceived)
end
if should_delete then
redis.call("ZREM", KEYS[1], message[1])
redis.call("HDEL", KEYS[1] .. ":Q", message[1], message[1] .. ":rc", message[1] .. ":fr")
else
redis.call("ZADD", KEYS[1], KEYS[3], message[1])
end
return response