mirror of
https://github.com/andrewyng/openworker.git
synced 2026-09-04 16:42:35 +00:00
The Python import namespace (coworker) and the live auth config strings are intentionally unchanged.
111 lines
3.4 KiB
Python
111 lines
3.4 KiB
Python
"""Small CLI to exercise connectors independently.
|
||
|
||
python -m coworker.connectors.cli status
|
||
Show which platforms are configured (token present) + allowlist size.
|
||
|
||
python -m coworker.connectors.cli fake [--user U1] [--allow U1]
|
||
Offline REPL: type messages as if they arrived from a platform; a built-in echo
|
||
handler replies through the gateway. Exercises auth + inbound dispatch + outbound
|
||
with no network. Try --user with someone NOT in --allow to see it dropped.
|
||
|
||
python -m coworker.connectors.cli send --target telegram:12345 --text "hi"
|
||
Live outbound via the send_message tool (needs a bot token in the SecretStore).
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
import argparse
|
||
import asyncio
|
||
import sys
|
||
|
||
from ..secrets import SecretStore
|
||
from .base import MessageEvent
|
||
from .config import ConnectorSettings, load_settings
|
||
from .fake import FakeAdapter
|
||
from .gateway import Gateway
|
||
from .tools import make_send_message_tool
|
||
|
||
|
||
def _cmd_status() -> int:
|
||
settings = load_settings(SecretStore())
|
||
print("Connector status:")
|
||
for platform, s in settings.items():
|
||
print(
|
||
f" {platform:10s} enabled={s.enabled} allow_all={s.allow_all} "
|
||
f"allowed_users={len(s.allowed_users)}"
|
||
)
|
||
return 0
|
||
|
||
|
||
async def _run_fake(user: str, allow: list[str]) -> int:
|
||
fake = FakeAdapter()
|
||
settings = {
|
||
"fake": ConnectorSettings(
|
||
platform="fake", enabled=True, allowed_users=set(allow), allow_all=not allow
|
||
)
|
||
}
|
||
gateway = Gateway(settings=settings)
|
||
|
||
async def echo_handler(event: MessageEvent) -> None:
|
||
reply = f"echo: {event.text}"
|
||
await gateway.deliver(event.source.target, reply)
|
||
print(f" ↩ sent to {event.source.target}: {reply!r}")
|
||
|
||
gateway.set_handler(echo_handler)
|
||
gateway.register(fake)
|
||
await gateway.start()
|
||
print(f"fake gateway up (user={user}, allow={allow or '∗ all'}). Ctrl-D to quit.\n")
|
||
|
||
while True:
|
||
try:
|
||
text = await asyncio.to_thread(input, "you> ")
|
||
except (EOFError, KeyboardInterrupt):
|
||
print()
|
||
break
|
||
text = text.strip()
|
||
if not text:
|
||
continue
|
||
before = len(fake.outbox)
|
||
await fake.inject(text, user_id=user, user_name=user)
|
||
if len(fake.outbox) == before:
|
||
print(" ⨯ dropped (not authorized)")
|
||
await gateway.stop()
|
||
return 0
|
||
|
||
|
||
def _cmd_send(target: str, text: str) -> int:
|
||
tool = make_send_message_tool(SecretStore())
|
||
result = tool(target=target, text=text)
|
||
print(result)
|
||
return 0 if result.get("ok") else 1
|
||
|
||
|
||
def main(argv: list[str] | None = None) -> int:
|
||
parser = argparse.ArgumentParser(prog="openworker-connectors")
|
||
sub = parser.add_subparsers(dest="cmd", required=True)
|
||
|
||
sub.add_parser("status")
|
||
|
||
p_fake = sub.add_parser("fake")
|
||
p_fake.add_argument("--user", default="u1")
|
||
p_fake.add_argument(
|
||
"--allow", action="append", default=[], help="authorized user id (repeatable)"
|
||
)
|
||
|
||
p_send = sub.add_parser("send")
|
||
p_send.add_argument("--target", required=True)
|
||
p_send.add_argument("--text", required=True)
|
||
|
||
args = parser.parse_args(argv)
|
||
if args.cmd == "status":
|
||
return _cmd_status()
|
||
if args.cmd == "fake":
|
||
return asyncio.run(_run_fake(args.user, args.allow))
|
||
if args.cmd == "send":
|
||
return _cmd_send(args.target, args.text)
|
||
return 1
|
||
|
||
|
||
if __name__ == "__main__":
|
||
sys.exit(main())
|