Create mrktplaats-cli from twdehands-cli, updating module/import names, command branding, and token paths while preserving command behavior and payload formats.
112 lines
3.6 KiB
Python
Executable File
112 lines
3.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Long-running poller for a conversation on the mrktplaats-cli.
|
|
|
|
Usage: python3 scripts/poll_nvidia_reply.py --conv CONV_ID --user USER_ID [--interval 900]
|
|
|
|
The script runs in a loop, calling `go run main.go messages --conv CONV_ID --limit 50`
|
|
in the repo directory, parses the JSON output and exits when it finds any message
|
|
whose `sender_id` is not the provided USER_ID (i.e. a seller reply).
|
|
|
|
When a reply is found the script writes a JSON file with the matching messages to
|
|
/home/joren/.local/share/opencode/tool-output/nvidia_reply_found.json and exits with
|
|
code 0. It logs progress to stdout/stderr so you can follow the `nohup` log file.
|
|
"""
|
|
|
|
import argparse
|
|
import json
|
|
import subprocess
|
|
import time
|
|
import os
|
|
from datetime import datetime
|
|
|
|
|
|
def now():
|
|
return datetime.utcnow().isoformat() + "Z"
|
|
|
|
|
|
def fetch_messages(conv, workdir):
|
|
# Run the mrktplaats-cli to fetch the conversation messages
|
|
cmd = ["go", "run", "main.go", "messages", "--conv", conv, "--limit", "50"]
|
|
proc = subprocess.run(cmd, cwd=workdir, capture_output=True, text=True)
|
|
if proc.returncode != 0:
|
|
raise RuntimeError(f"messages command failed: {proc.stderr.strip()}")
|
|
return proc.stdout
|
|
|
|
|
|
def find_foreign_messages(json_text, user_id):
|
|
data = json.loads(json_text)
|
|
msgs = data.get("messages") or []
|
|
foreign = [m for m in msgs if int(m.get("sender_id", 0)) != int(user_id)]
|
|
return foreign
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("--conv", required=True, help="Conversation id to poll")
|
|
parser.add_argument("--user", required=True, help="Our user id (numeric)")
|
|
parser.add_argument(
|
|
"--interval",
|
|
type=int,
|
|
default=900,
|
|
help="Poll interval in seconds (default 900 = 15m)",
|
|
)
|
|
parser.add_argument(
|
|
"--workdir",
|
|
default="/home/joren/dev/marktplaatsApi/mrktplaats-cli",
|
|
help="Path to mrktplaats-cli repo",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
out_dir = os.path.expanduser("/home/joren/.local/share/opencode/tool-output")
|
|
os.makedirs(out_dir, exist_ok=True)
|
|
found_path = os.path.join(out_dir, "nvidia_reply_found.json")
|
|
|
|
print(
|
|
f"{now()} Poller started for conv={args.conv}, user={args.user}, interval={args.interval}s"
|
|
)
|
|
# write pid file
|
|
pid_path = os.path.join(out_dir, "nvidia_poll.pid")
|
|
with open(pid_path, "w") as f:
|
|
f.write(str(os.getpid()))
|
|
|
|
try:
|
|
while True:
|
|
try:
|
|
raw = fetch_messages(args.conv, args.workdir)
|
|
except Exception as e:
|
|
print(f"{now()} Error fetching messages: {e}")
|
|
time.sleep(30)
|
|
continue
|
|
|
|
try:
|
|
foreign = find_foreign_messages(raw, args.user)
|
|
except Exception as e:
|
|
print(f"{now()} Error parsing messages JSON: {e}")
|
|
time.sleep(30)
|
|
continue
|
|
|
|
if foreign:
|
|
result = {"conv": args.conv, "detected_at": now(), "messages": foreign}
|
|
with open(found_path, "w") as f:
|
|
json.dump(result, f, indent=2)
|
|
print(
|
|
f"{now()} Found {len(foreign)} foreign message(s) — wrote {found_path}"
|
|
)
|
|
# also print the messages for immediate visibility
|
|
print(json.dumps(result, indent=2))
|
|
return 0
|
|
|
|
print(f"{now()} No reply yet; sleeping {args.interval} seconds")
|
|
time.sleep(args.interval)
|
|
finally:
|
|
# cleanup pid file
|
|
try:
|
|
os.remove(pid_path)
|
|
except Exception:
|
|
pass
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|