import socket, time, json, base64, sys

HOST = '10.24.8.82'

class R:
    def __init__(s):
        s.s = socket.create_connection((HOST, 6379), 5); s.s.settimeout(120); s.buf = b''
    def send(s, *a):
        p = b'*%d\r\n' % len(a)
        for x in a:
            x = x.encode() if isinstance(x, str) else x
            p += b'$%d\r\n%s\r\n' % (len(x), x)
        s.s.sendall(p)
    def readline(s):
        while b'\r\n' not in s.buf:
            d = s.s.recv(65536)
            if not d: return None
            s.buf += d
        line, s.buf = s.buf.split(b'\r\n', 1)
        return line
    def readn(s, n):
        while len(s.buf) < n + 2:
            d = s.s.recv(65536)
            if not d: break
            s.buf += d
        data, s.buf = s.buf[:n], s.buf[n+2:]
        return data
    def reply(s):
        line = s.readline()
        if line is None: return None
        t = line[:1]
        if t == b'+': return line[1:].decode()
        if t == b':': return int(line[1:])
        if t == b'$':
            n = int(line[1:])
            if n == -1: return None
            return s.readn(n)
        if t == b'*':
            n = int(line[1:])
            return [s.reply() for _ in range(n)]
        return line.decode(errors='replace')

r = R()
r.send('SELECT', '1'); print('db:', r.reply())
print('waiting for a task (BRPOP 100s)...')
r.send('BRPOP', 'celery', '100')
res = r.reply()
if not res or res == [None, None]:
    print('no task arrived')
    sys.exit(0)
_, msg = res
msg = msg.decode()
print('GOT TASK MESSAGE')
env = json.loads(msg)
body = json.loads(base64.b64decode(env['body']))
task = env.get('headers', {}).get('task') or env.get('headers', {}).get('task') 
print('task name:', task)
print('task id:', env.get('headers', {}).get('id'))
print('args/kwargs/embed:', str(body)[:300])
print('origin:', env.get('headers', {}).get('origin'))
# push the original back so prod executes it
r2 = R()
r2.send('SELECT', '1'); r2.reply()
r2.send('LPUSH', 'celery', msg)
print('re-queued original:', r2.reply())
