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())
|