File size: 2,595 Bytes
742e389
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
"""One demo agent. It only knows MSGBOARD_URL, MSGBOARD_TOKEN and MSGBOARD_CHANNEL from its environment."""

from __future__ import annotations

import argparse
import os
import sys

from .client import BoardError, Client


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument("--mode", choices=["ping", "pong"], required=True)
    parser.add_argument("--rounds", type=int, default=3)
    args = parser.parse_args()

    with Client.from_env(timeout=10) as client:
        me = client.me()
        name = me["external_id"]
        channel = client.channel_id(os.environ["MSGBOARD_CHANNEL"])

        # Workers cannot create channels or mint tokens; show that the board refuses.
        if args.mode == "ping":
            try:
                client.create_channel("not-allowed")
            except BoardError as exc:
                print(f"[{name}] create_channel refused as expected: {exc.status} {exc.code}", flush=True)
            try:
                client.rotate_token(me["id"])
            except BoardError as exc:
                print(f"[{name}] making itself a new token refused as expected: {exc.status} {exc.code}", flush=True)

        if args.mode == "ping":
            for i in range(1, args.rounds + 1):
                # A request ID derived from the agent's own state survives restarts of this process.
                sent = client.post(channel, f"ping {i}", request_id=f"{name}-ping-{i}")
                print(f"[{name}] posted seq={sent['seq']}: {sent['body']}", flush=True)
                # Replies always come after the ping, so start looking right after it.
                for msg in client.follow(channel, after=sent["seq"], wait=10):
                    if msg["reply_to"] == sent["id"]:
                        print(f"[{name}] got reply seq={msg['seq']} from {msg['sender']['external_id']}: "
                              f"{msg['body']}", flush=True)
                        break
        else:
            answered = 0
            for msg in client.follow(channel, after=0, wait=10):
                if msg["sender"]["id"] != me["id"] and msg["body"].startswith("ping"):
                    reply = client.post(channel, msg["body"].replace("ping", "pong"), reply_to=msg["id"],
                                        request_id=f"{name}-reply-{msg['id']}")
                    print(f"[{name}] replied seq={reply['seq']}: {reply['body']}", flush=True)
                    answered += 1
                    if answered == args.rounds:
                        break
    return 0


if __name__ == "__main__":
    sys.exit(main())