Initial Marktplaats CLI scaffold

Create mrktplaats-cli from twdehands-cli, updating module/import names, command branding, and token paths while preserving command behavior and payload formats.
This commit is contained in:
2026-04-15 23:45:49 +02:00
commit 7470bf1baa
9 changed files with 2753 additions and 0 deletions

111
scripts/poll_nvidia_reply.py Executable file
View File

@@ -0,0 +1,111 @@
#!/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()