From 4b06d43b8891b8982adea157e400f1c4a874273f Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Fri, 10 Jan 2025 18:28:37 -0500 Subject: [PATCH] Further flesh out xenu-nntp-group --- bin/xenu-nntp-group | 84 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 19 deletions(-) diff --git a/bin/xenu-nntp-group b/bin/xenu-nntp-group index 561bac1..6cdff6c 100755 --- a/bin/xenu-nntp-group +++ b/bin/xenu-nntp-group @@ -1,5 +1,6 @@ #! /usr/bin/env python3 +import sys import argparse import datetime @@ -7,29 +8,74 @@ from xenu_nntp.config import Config from xenu_nntp.db import Database from xenu_nntp.newsgroup import Newsgroup -parser = argparse.ArgumentParser(description='Create new account') -parser.add_argument('--config-file', '-f', type=str, help='Specify a configuration file location') -parser.add_argument('--created-on', type=str, help='Specify creation date of newsgroup') -parser.add_argument('--created-by', type=str, required=True, help='Print messages when importing files and messages') -parser.add_argument('--description', type=str, required=True, help='Newsgroup topic summary') -parser.add_argument('--writable', action='store_true', help='Specify whether group is writable') -parser.add_argument('name', type=str, help='Name of newsgroup to create') +def create(db: Database, args: list[str]): + parser = argparse.ArgumentParser( + description = 'Create new newsgroup', + prog = '%s create' % sys.argv[0] + ) + + parser.add_argument('--created-on', type=str, help='Specify creation date of newsgroup') + parser.add_argument('--created-by', type=str, required=True, help='Print messages when importing files and messages') + parser.add_argument('--description', type=str, required=True, help='Newsgroup topic summary') + parser.add_argument('--writable', action='store_true', help='Specify whether group is writable') + parser.add_argument('name', type=str, help='Name of newsgroup to create') + + args = parser.parse_args(args) + + if args.created_on is None: + args.created_on = datetime.datetime.now(datetime.UTC).isoformat() + + newsgroup = Newsgroup() + newsgroup.name = args.name + newsgroup.description = args.description + newsgroup.created_on = datetime.datetime.fromisoformat(args.created_on) + newsgroup.created_by = args.created_by + newsgroup.writable = args.writable or False + + db.execute("begin transaction") + db.add(newsgroup) + db.commit() + + return 0 + +def delete(db: Database, args: list[str]): + parser = argparse.ArgumentParser( + description = 'Delete newsgroup', + prog = '%s delete' % sys.argv[0] + ) + + parser.add_argument('name', type=str, help='Name of newsgroup to delete') + + args = parser.parse_args(args) + + newsgroup = db.get(Newsgroup, {'name': args.name}) + + if newsgroup is None: + print(f"Unable to find newsgroup '{args.name}'", file=sys.stderr) + return 1 + + db.execute('delete from newsgroup_message where newsgroup_id = %s', (newsgroup.id,)) + db.execute('delete from newsgroup where id = %s', (newsgroup.id,)) + + return 0 + +COMMANDS = { + 'create': create, + 'delete': delete +} + +parser = argparse.ArgumentParser(description='Manage newsgroups') +parser.add_argument('--config-file', '-f', type=str, help='Specify a configuration file location') +parser.add_argument('command', type=str, help='Name of subcommand') +parser.add_argument('args', type=str, nargs='*') args = parser.parse_args() -if args.created_on is None: - args.created_on = datetime.datetime.now(datetime.UTC).isoformat() - config = Config.load(args.config_file) db = Database.from_config(config) -newsgroup = Newsgroup() -newsgroup.name = args.name -newsgroup.description = args.description -newsgroup.created_on = datetime.datetime.fromisoformat(args.created_on) -newsgroup.created_by = args.created_by -newsgroup.writable = args.writable or False +if args.command not in COMMANDS: + print(f"Unknown command '{args.command}'", file=sys.stderr) + exit(1) -db.execute("begin transaction") -db.add(newsgroup) -db.commit() +exit(COMMANDS[args.command](db, args.args))