Ivan Habunek 2022-11-23 08:30:44 +01:00
rodzic 92b9b4ef18
commit 1801f04b6a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: F5F0623FF5EBCB3D
5 zmienionych plików z 84 dodań i 3 usunięć

Wyświetl plik

@ -358,3 +358,7 @@ def clear_notifications(app, user):
def get_instance(domain, scheme="https"): def get_instance(domain, scheme="https"):
url = "{}://{}/api/v1/instance".format(scheme, domain) url = "{}://{}/api/v1/instance".format(scheme, domain)
return http.anon_get(url).json() return http.anon_get(url).json()
def get_instance_by_url(url):
return http.anon_get(f"{url}/api/v1/instance").json()

Wyświetl plik

@ -1,13 +1,19 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import sys import sys
import textwrap
from pprint import pprint
from urllib.parse import urlparse
from urwid.escape import re
from toot import api, config from toot import api, config
from toot.auth import login_interactive, login_browser_interactive, create_app_interactive from toot.auth import login_interactive, login_browser_interactive, create_app_interactive
from toot.exceptions import ConsoleError, NotFoundError from toot.exceptions import ConsoleError, NotFoundError
from toot.output import (print_out, print_instance, print_account, print_acct_list, from toot.output import (print_err, print_out, print_instance, print_account, print_acct_list,
print_search_results, print_timeline, print_notifications) print_search_results, print_timeline, print_notifications, prompt)
from toot.utils import assert_domain_exists, editor_input, multiline_input, EOF_KEY from toot.utils import assert_domain_exists, editor_input, get_text, is_url, multiline_input, EOF_KEY, parse_html
def get_timeline_generator(app, user, args): def get_timeline_generator(app, user, args):
@ -197,6 +203,31 @@ def auth(app, user, args):
print_out("\nAuth tokens are stored in: <blue>{}</blue>".format(path)) print_out("\nAuth tokens are stored in: <blue>{}</blue>".format(path))
def register(app, user, args):
instance_url = args.instance or prompt("Instance URL", validate=is_url)
instance_url = instance_url.rstrip("/")
parsed_url = urlparse(instance_url)
assert_domain_exists(parsed_url.netloc)
base_url = f"{parsed_url.scheme}://{parsed_url.netloc}"
print(base_url)
try:
instance = api.get_instance_by_url(base_url)
except NotFoundError:
raise ConsoleError(f"Mastdon instance not found at {base_url}")
print_out()
print_instance(instance)
# pprint(instance)
# app = create_app_interactive(instance=args.instance, scheme=args.scheme)
# print(app)
# print(user)
def login_cli(app, user, args): def login_cli(app, user, args):
app = create_app_interactive(instance=args.instance, scheme=args.scheme) app = create_app_interactive(instance=args.instance, scheme=args.scheme)
login_interactive(app, args.email) login_interactive(app, args.email)

Wyświetl plik

@ -10,6 +10,7 @@ from collections import namedtuple
from toot import config, commands, CLIENT_NAME, CLIENT_WEBSITE, __version__ from toot import config, commands, CLIENT_NAME, CLIENT_WEBSITE, __version__
from toot.exceptions import ApiError, ConsoleError from toot.exceptions import ApiError, ConsoleError
from toot.output import print_out, print_err from toot.output import print_out, print_err
from toot.utils import is_url
VISIBILITY_CHOICES = ['public', 'unlisted', 'private', 'direct'] VISIBILITY_CHOICES = ['public', 'unlisted', 'private', 'direct']
@ -55,6 +56,12 @@ def editor(value):
return exe return exe
def url(value):
if not is_url(value):
raise ArgumentTypeError("Invalid URL")
return value
Command = namedtuple("Command", ["name", "description", "require_auth", "arguments"]) Command = namedtuple("Command", ["name", "description", "require_auth", "arguments"])
@ -93,6 +100,11 @@ instance_arg = (["-i", "--instance"], {
"help": 'mastodon instance to log into e.g. "mastodon.social"', "help": 'mastodon instance to log into e.g. "mastodon.social"',
}) })
instance_url_arg = (["-i", "--instance"], {
"type": url,
"help": "Mastodon instance URL",
})
email_arg = (["-e", "--email"], { email_arg = (["-e", "--email"], {
"type": str, "type": str,
"help": 'email address to log in with', "help": 'email address to log in with',
@ -156,6 +168,12 @@ timeline_args = common_timeline_args + [
] ]
AUTH_COMMANDS = [ AUTH_COMMANDS = [
Command(
name="register",
description="Register a new account",
arguments=[instance_url_arg],
require_auth=False,
),
Command( Command(
name="login", name="login",
description="Log into a mastodon instance using your browser (recommended)", description="Log into a mastodon instance using your browser (recommended)",

Wyświetl plik

@ -72,6 +72,27 @@ USE_ANSI_COLOR = use_ansi_color()
QUIET = "--quiet" in sys.argv QUIET = "--quiet" in sys.argv
def prompt(caption, default=None, validate=None):
default_label = f" [default: {default}]" if default else ""
while True:
print_out(f"{caption}{default_label}: ", end="")
value = input().strip()
if not value:
if default:
return default
else:
continue
if validate:
if not validate(value):
print_out("<red>Invalid value</red>")
continue
return value
def print_out(*args, **kwargs): def print_out(*args, **kwargs):
if not QUIET: if not QUIET:
args = [colorize(a) if USE_ANSI_COLOR else strip_tags(a) for a in args] args = [colorize(a) if USE_ANSI_COLOR else strip_tags(a) for a in args]

Wyświetl plik

@ -1,11 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from argparse import ArgumentTypeError
import os import os
import re import re
import socket import socket
import subprocess import subprocess
import tempfile import tempfile
import unicodedata import unicodedata
from urllib.parse import urlparse
import warnings import warnings
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
@ -116,3 +118,8 @@ def editor_input(editor, initial_text):
text = f.read().decode() text = f.read().decode()
return text.split(EDITOR_DIVIDER)[0].strip() return text.split(EDITOR_DIVIDER)[0].strip()
def is_url(value):
url = urlparse(value)
return all((url.scheme, url.netloc))