#!/usr/bin/env python3
"""
Command-line interface for Keet messaging.
This script provides a command-line interface for interacting with the Keet messaging platform.
"""
import argparse
import asyncio
import json
import logging
import os
import sys
from pathlib import Path
from typing import Dict, List, Any, Optional
from .client import KeetClient
from .utils import extract_room_key_from_invite, is_valid_hypercore_key, normalize_hypercore_key
# Set up logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
async def main():
"""Main entry point for the Keet CLI."""
parser = argparse.ArgumentParser(description="Command-line interface for Keet messaging")
parser.add_argument("--storage", type=str, help="Path to store Keet data")
subparsers = parser.add_subparsers(dest="command", help="Command to execute")
# Get identity command
get_identity_parser = subparsers.add_parser("get-identity", help="Get the current identity")
# Create identity command
create_identity_parser = subparsers.add_parser("create-identity", help="Create a new identity")
create_identity_parser.add_argument("--name", type=str, help="Display name for the identity")
# Get recent rooms command
get_recent_rooms_parser = subparsers.add_parser("get-recent-rooms", help="Get a list of recent rooms")
# Join room command
join_room_parser = subparsers.add_parser("join-room", help="Join a room")
join_room_parser.add_argument("--room-key", type=str, required=True, help="Room key or invite link")
# Get messages command
get_messages_parser = subparsers.add_parser("get-messages", help="Get messages from a room")
get_messages_parser.add_argument("--room-key", type=str, required=True, help="Room key or invite link")
# Send message command
send_message_parser = subparsers.add_parser("send-message", help="Send a message to a room")
send_message_parser.add_argument("--room-key", type=str, required=True, help="Room key or invite link")
send_message_parser.add_argument("--message", type=str, required=True, help="Message to send")
# Output file option for commands that return data
for p in [get_identity_parser, create_identity_parser, get_recent_rooms_parser, get_messages_parser]:
p.add_argument("--output", type=str, help="Output file to write the result to (JSON format)")
args = parser.parse_args()
if not args.command:
parser.print_help()
return 1
# Initialize the client
client = KeetClient(args.storage)
# Execute the command
if args.command == "get-identity":
result = await client.get_identity()
if args.output:
with open(args.output, "w") as f:
json.dump(result, f)
else:
print(json.dumps(result, indent=2))
elif args.command == "create-identity":
result = await client.create_identity(args.name)
if args.output:
with open(args.output, "w") as f:
json.dump(result, f)
else:
print(json.dumps(result, indent=2))
elif args.command == "get-recent-rooms":
result = await client.get_recent_rooms()
if args.output:
with open(args.output, "w") as f:
json.dump(result, f)
else:
print(json.dumps(result, indent=2))
elif args.command == "join-room":
success = await client.join_room(args.room_key)
if success:
logger.info(f"Successfully joined room: {args.room_key}")
else:
logger.error(f"Failed to join room: {args.room_key}")
return 1
elif args.command == "get-messages":
result = await client.get_messages(args.room_key)
if args.output:
with open(args.output, "w") as f:
json.dump(result, f)
else:
print(json.dumps(result, indent=2))
elif args.command == "send-message":
success = await client.send_message(args.room_key, args.message)
if success:
logger.info(f"Successfully sent message to room: {args.room_key}")
else:
logger.error(f"Failed to send message to room: {args.room_key}")
return 1
return 0
if __name__ == "__main__":
sys.exit(asyncio.run(main()))