Beispiel #1
0
def login(args):
    # get service
    service = onlinejudge.dispatch.service_from_url(args.url)
    if service is None:
        sys.exit(1)

    # configure
    kwargs = {}
    if service.get_name() == 'yukicoder':
        if not args.method:
            args.method = 'github'
        if args.method not in [ 'github', 'twitter' ]:
            log.failure('login for yukicoder: invalid option: --method %s', args.method)
            sys.exit(1)
        kwargs['method'] = args.method
    else:
        if args.method:
            log.failure('login for %s: invalid option: --method %s', service.get_name(), args.method)
            sys.exit(1)

    # login
    def get_credentials():
        if args.username is None:
            args.username = input('Username: ')
        if args.password is None:
            args.password = getpass.getpass()
        return args.username, args.password
    with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess:
        service.login(get_credentials, session=sess, **kwargs)
def generate_scanner(args: 'argparse.Namespace') -> None:
    if not args.silent:
        log.warning('This feature is ' + log.red('experimental') + '.')
    if args.silent:
        for handler in log.logger.handlers:
            log.removeHandler(handler)
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)
    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:
        it = problem.get_input_format(session=sess)  # type: Any
    if not it:
        log.error('input format not found')
        sys.exit(1)
    try:
        log.debug('original data: %s', repr(it))
        it = list(tokenize(it))
        log.debug('tokenized: %s', str(it))
        it = list(parse(it))
        log.debug('parsed: %s', str(it))
        it = postprocess(it)
        log.debug('postprocessed: %s', str(it))
        it = export(it, use_scanf=args.scanf, repeat_macro=args.repeat_macro)
        log.debug('result: %s', repr(it))
    except:
        log.error('something wrong')
        raise
    log.success('success:')
    print(log.bold(it.rstrip()))  # to stdout
def generate_scanner(args):
    if not args.silent:
        log.warning("This feature is " + log.red("experimental") + ".")
    if args.silent:
        for handler in log.logger.handlers:
            log.removeHandler(handler)
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)
    with utils.with_cookiejar(utils.new_default_session(), path=args.cookie) as sess:
        it = problem.get_input_format(session=sess)
    if not it:
        log.error("input format not found")
        sys.exit(1)
    try:
        log.debug("original data: %s", repr(it))
        it = list(tokenize(it))
        log.debug("tokenized: %s", str(it))
        it = list(parse(it))
        log.debug("parsed: %s", str(it))
        it = postprocess(it)
        log.debug("postprocessed: %s", str(it))
        it = export(it, use_scanf=args.scanf, repeat_macro=args.repeat_macro)
        log.debug("result: %s", repr(it))
    except:
        log.error("something wrong")
        raise
    log.success("success:")
    print(log.bold(it.rstrip()))  # to stdout
Beispiel #4
0
def download(args: 'argparse.Namespace') -> None:
    # prepare values
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)
    kwargs = {}
    if args.system:
        supported_service_names = ['aoj', 'yukicoder']
        if problem.get_service().get_name() not in supported_service_names:
            log.error('--system for %s is not supported',
                      problem.get_service().get_name())
            sys.exit(1)
        kwargs['is_system'] = True
    if args.format is None:
        if kwargs.get('is_system'):
            if problem.get_service().get_name() == 'yukicoder':
                args.format = '%b.%e'
            else:
                args.format = '%i.%e'
        else:
            args.format = 'sample-%i.%e'

    # get samples from the server
    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:
        samples = problem.download(session=sess, **kwargs)  # type: ignore

    # write samples to files
    for i, sample in enumerate(samples):
        log.emit('')
        log.info('sample %d', i)
        for kind in ['input', 'output']:
            ext = kind[:-3]
            data = getattr(sample, kind).data
            name = getattr(sample, kind).name
            table = {}
            table['i'] = str(i + 1)
            table['e'] = ext
            table['n'] = name
            table['b'] = os.path.basename(name)
            table['d'] = os.path.dirname(name)
            path = os.path.join(args.directory,
                                utils.parcentformat(args.format, table))
            log.status('%sput: %s', ext, name)
            log.emit(colorama.Style.BRIGHT + data.rstrip() +
                     colorama.Style.RESET_ALL)
            if args.dry_run:
                continue
            if os.path.exists(path):
                log.warning('file already exists: %s', path)
                if not args.overwrite:
                    log.warning('skipped')
                    continue
            os.makedirs(os.path.dirname(path), exist_ok=True)
            with open(path, 'w') as fh:
                fh.write(data)
            log.success('saved to: %s', path)
Beispiel #5
0
def download(args):
    # prepare values
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)
    kwargs = {}
    if args.system:
        supported_service_names = ["aoj", "yukicoder"]
        if problem.get_service().get_name() not in supported_service_names:
            log.error("--system for %s is not supported",
                      problem.get_service().get_name())
            sys.exit(1)
        kwargs["is_system"] = True
    if args.format is None:
        if kwargs.get("is_system"):
            if problem.get_service().get_name() == "yukicoder":
                args.format = "%b.%e"
            else:
                args.format = "%i.%e"
        else:
            args.format = "sample-%i.%e"

    # get samples from the server
    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:
        samples = problem.download(session=sess, **kwargs)

    # write samples to files
    for i, sample in enumerate(samples):
        log.emit("")
        log.info("sample %d", i)
        for kind in ["input", "output"]:
            ext = kind[:-3]
            data = sample[kind]["data"]
            name = sample[kind]["name"]
            table = {}
            table["i"] = str(i + 1)
            table["e"] = ext
            table["n"] = name
            table["b"] = os.path.basename(name)
            table["d"] = os.path.dirname(name)
            path = os.path.join(args.directory,
                                utils.parcentformat(args.format, table))
            log.status("%sput: %s", ext, name)
            log.emit(colorama.Style.BRIGHT + data.rstrip() +
                     colorama.Style.RESET_ALL)
            if args.dry_run:
                continue
            if os.path.exists(path):
                log.warning("file already exists: %s", path)
                if not args.overwrite:
                    log.warning("skipped")
                    continue
            os.makedirs(os.path.dirname(path), exist_ok=True)
            with open(path, "w", encoding="utf-8") as fh:
                fh.write(data)
            log.success("saved to: %s", path)
Beispiel #6
0
def login(args: 'argparse.Namespace') -> None:
    # get service
    service = onlinejudge.dispatch.service_from_url(args.url)
    if service is None:
        sys.exit(1)

    # configure
    kwargs = {}
    if service.get_name() == 'yukicoder':
        if not args.method:
            args.method = 'github'
        if args.method not in ['github', 'twitter']:
            log.failure('login for yukicoder: invalid option: --method %s',
                        args.method)
            sys.exit(1)
        kwargs['method'] = args.method
    else:
        if args.method:
            log.failure('login for %s: invalid option: --method %s',
                        service.get_name(), args.method)
            sys.exit(1)

    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:

        if args.check:
            if service.is_logged_in(session=sess):
                log.info('You have already signed in.')
            else:
                log.info('You are not signed in.')
                sys.exit(1)

        else:
            # login
            def get_credentials() -> Tuple[str, str]:
                if args.username is None:
                    args.username = input('Username: '******'If you don\'t want to give your password to this program, you can give only your session tokens.'
            )
            log.info(
                'see: https://github.com/kmyk/online-judge-tools/blob/master/LOGIN_WITH_COOKIES.md'
            )

            service.login(get_credentials, session=sess,
                          **kwargs)  # type: ignore
Beispiel #7
0
def submit(args):
    # parse url
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)

    # read code
    with open(args.file) as fh:
        code = fh.buffer.read()
    try:
        s = code.decode()  # for logging
    except UnicodeDecodeError as e:
        log.failure('%s: %s', e.__class__.__name__, str(e))
        s = repr(code)[1:]
    log.info('code:')
    log.emit(log.bold(s))

    # prepare kwargs
    kwargs = {}
    if problem.get_service().get_name() == 'topcoder':
        if args.full_submission:
            kwargs['kind'] = 'full'
        else:
            kwargs['kind'] = 'example'

    # make session
    if problem.get_service().get_name() == 'topcoder':
        sess = utils.run_webdriver(args.webdriver,
                                   target_url=problem.get_service().get_url(),
                                   headless=not args.verbose,
                                   cookie_path=args.cookie)
    else:
        sess = utils.with_cookiejar(utils.new_default_session(),
                                    path=args.cookie)

    with sess as sess:
        # language
        langs = problem.get_language_dict(session=sess)
        if args.language not in langs:
            log.error('language is unknown')
            log.info('supported languages are:')
            for lang in sorted(langs.keys()):
                log.emit('%s (%s)', lang, langs[lang]['description'])
            sys.exit(1)

        # confirm
        if args.wait:
            log.status('sleep(%.2f)', args.wait)
            time.sleep(args.wait)
        if not args.yes:
            sys.stdout.write('Are you sure? [y/N] ')
            sys.stdout.flush()
            c = sys.stdin.read(1)
            if c != 'y':
                log.info('terminated.')
                return

        # submit
        submission = problem.submit(code,
                                    language=args.language,
                                    session=sess,
                                    **kwargs)

        # show result
        if submission is None:
            log.failure('submission failed')
        else:
            if args.open:
                if not isinstance(args.open, str):
                    args.open = None
                    for browser in default_url_opener:
                        args.open = shutil.which(browser)
                        if args.open:
                            break
                if not args.open:
                    log.failure(
                        'couldn\'t open the url. please specify a browser')
                else:
                    log.info('open the submission page with: %s', args.open)
                    subprocess.check_call(
                        [args.open, submission.get_url()],
                        stdin=sys.stdin,
                        stdout=sys.stdout,
                        stderr=sys.stderr)
Beispiel #8
0
def download(args: 'argparse.Namespace') -> None:
    # prepare values
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)
    is_default_format = args.format is None and args.directory is None  # must be here since args.directory and args.format are overwritten
    if args.directory is None:
        args.directory = pathlib.Path('test')
    if args.format is None:
        if args.system:
            if problem.get_service().get_name() == 'yukicoder':
                args.format = '%b.%e'
            else:
                args.format = '%i.%e'
        else:
            args.format = 'sample-%i.%e'

    # get samples from the server
    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:
        if args.system:
            samples = problem.download_system_cases(
                session=sess)  # type: ignore
        else:
            samples = problem.download_sample_cases(
                session=sess)  # type: ignore

    # append the history for submit command
    if not args.dry_run and is_default_format:
        history = onlinejudge.implementation.download_history.DownloadHistory()
        history.add(problem)

    # write samples to files
    for i, sample in enumerate(samples):
        log.faster_emit('')
        log.faster_info('sample %d', i)
        for kind in ['input', 'output']:
            ext = kind[:-3]
            data = getattr(sample, kind).data
            name = getattr(sample, kind).name
            table = {}
            table['i'] = str(i + 1)
            table['e'] = ext
            table['n'] = name
            table['b'] = os.path.basename(name)
            table['d'] = os.path.dirname(name)
            path = args.directory / utils.percentformat(
                args.format, table)  # type: pathlib.Path
            log.faster_status('%sput: %s', ext, name)
            log.faster_emit(colorama.Style.BRIGHT + data.rstrip() +
                            colorama.Style.RESET_ALL)
            if args.dry_run:
                continue
            if path.exists():
                log.faster_warning('file already exists: %s', path)
                if not args.overwrite:
                    log.faster_warning('skipped')
                    continue
            path.parent.mkdir(parents=True, exist_ok=True)
            with path.open('w') as fh:
                fh.write(data)
            log.faster_success('saved to: %s', path)

    # print json
    if args.json:
        print(json.dumps(list(map(convert_sample_to_dict, samples))))
Beispiel #9
0
def submit(args: 'argparse.Namespace') -> None:
    # parse url
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)

    # read code
    with open(args.file) as fh:
        code = fh.buffer.read()
    format_config = {
        'dos2unix': args.format_dos2unix or args.golf,
        'rstrip': args.format_dos2unix or args.golf,
    }
    code = format_code(code, **format_config)

    # report code
    try:
        s = code.decode()
    except UnicodeDecodeError as e:
        log.failure('%s: %s', e.__class__.__name__, str(e))
        s = repr(code)[1:]
    log.info('code (%d byte):', len(code))
    log.emit(log.bold(s))

    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:
        # guess or select language ids
        langs = problem.get_language_dict(session=sess)
        matched_lang_ids: Optional[List[str]] = None
        if args.guess:
            kwargs = {
                'language_dict': langs,
                'cxx_latest': args.guess_cxx_latest,
                'cxx_compiler': args.guess_cxx_compiler,
                'python_version': args.guess_python_version,
                'python_interpreter': args.guess_python_interpreter,
            }
            matched_lang_ids = guess_lang_ids_of_file(args.file, code,
                                                      **kwargs)
            if args.language is not None:
                matched_lang_ids = select_ids_of_matched_languages(
                    args.language.split(),
                    matched_lang_ids,
                    language_dict=langs)
        else:
            if args.language is None:
                matched_lang_ids = None
            elif args.language in langs:
                matched_lang_ids = [args.language]
            else:
                matched_lang_ids = select_ids_of_matched_languages(
                    args.language.split(),
                    list(langs.keys()),
                    language_dict=langs)

        # report selected language ids
        if matched_lang_ids is not None and len(matched_lang_ids) == 1:
            args.language = matched_lang_ids[0]
            log.info('choosed language: %s (%s)', args.language,
                     langs[args.language]['description'])
        else:
            if matched_lang_ids is None:
                log.error('language is unknown')
                log.info('supported languages are:')
            elif len(matched_lang_ids) == 0:
                log.error('no languages are matched')
                log.info('supported languages are:')
            else:
                log.error('Matched languages were not narrowed down to one.')
                log.info('You have to choose:')
            for lang_id in sorted(matched_lang_ids or langs.keys()):
                log.emit('%s (%s)', lang_id, langs[lang_id]['description'])
            sys.exit(1)

        # confirm
        if args.wait:
            log.status('sleep(%.2f)', args.wait)
            time.sleep(args.wait)
        if not args.yes:
            sys.stdout.write('Are you sure? [y/N] ')
            sys.stdout.flush()
            c = sys.stdin.read(1)
            if c != 'y':
                log.info('terminated.')
                return

        # submit
        kwargs = {}
        if problem.get_service().get_name() == 'topcoder':
            if args.full_submission:
                kwargs['kind'] = 'full'
            else:
                kwargs['kind'] = 'example'
        submission = problem.submit(code,
                                    language=args.language,
                                    session=sess,
                                    **kwargs)  # type: ignore

        # show result
        if submission is None:
            log.failure('submission failed')
        else:
            if args.open:
                if args.open_browser:
                    browser = args.open_browser
                else:
                    for browser in default_url_opener:
                        if shutil.which(browser):
                            break
                    else:
                        browser = None
                        log.failure(
                            'couldn\'t find browsers to open the url. please specify a browser'
                        )
                if browser:
                    log.info('open the submission page with: %s', browser)
                    subprocess.check_call(
                        [browser, submission.get_url()],
                        stdin=sys.stdin,
                        stdout=sys.stdout,
                        stderr=sys.stderr)
Beispiel #10
0
def submit(args):
    # parse url
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)

    # read code
    with open(args.file) as fh:
        code = fh.buffer.read()
    format_config = {
        "dos2unix": args.format_dos2unix or args.golf,
        "rstrip": args.format_dos2unix or args.golf,
    }
    code = format_code(code, **format_config)

    # report code
    try:
        s = code.decode()
    except UnicodeDecodeError as e:
        log.failure("%s: %s", e.__class__.__name__, str(e))
        s = repr(code)[1:]
    log.info("code (%d byte):", len(code))
    log.emit(log.bold(s))

    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:
        # guess or select language ids
        langs = problem.get_language_dict(session=sess)
        if args.guess:
            kwargs = {
                "language_dict": langs,
                "cxx_latest": args.guess_cxx_latest,
                "cxx_compiler": args.guess_cxx_compiler,
                "python_version": args.guess_python_version,
                "python_interpreter": args.guess_python_interpreter,
            }
            matched_lang_ids = guess_lang_ids_of_file(args.file, code,
                                                      **kwargs)
            if args.language is not None:
                matched_lang_ids = select_ids_of_matched_languages(
                    args.language.split(),
                    matched_lang_ids,
                    language_dict=langs)
        else:
            if args.language is None:
                matched_lang_ids = None
            elif args.language in langs:
                matched_lang_ids = [args.language]
            else:
                matched_lang_ids = select_ids_of_matched_languages(
                    args.language.split(), langs.keys(), language_dict=langs)

        # report selected language ids
        if matched_lang_ids is not None and len(matched_lang_ids) == 1:
            args.language = matched_lang_ids[0]
            log.info(
                "choosed language: %s (%s)",
                args.language,
                langs[args.language]["description"],
            )
        else:
            if matched_lang_ids is None:
                log.error("language is unknown")
                log.info("supported languages are:")
            elif len(matched_lang_ids) == 0:
                log.error("no languages are matched")
                log.info("supported languages are:")
            else:
                log.error("Matched languages were not narrowed down to one.")
                log.info("You have to choose:")
            for lang_id in sorted(matched_lang_ids or langs.keys()):
                log.emit("%s (%s)", lang_id, langs[lang_id]["description"])
            sys.exit(1)

        # confirm
        if args.wait:
            log.status("sleep(%.2f)", args.wait)
            time.sleep(args.wait)
        if not args.yes:
            sys.stdout.write("Are you sure? [y/N] ")
            sys.stdout.flush()
            c = sys.stdin.read(1)
            if c != "y":
                log.info("terminated.")
                return

        # submit
        kwargs = {}
        if problem.get_service().get_name() == "topcoder":
            if args.full_submission:
                kwargs["kind"] = "full"
            else:
                kwargs["kind"] = "example"
        submission = problem.submit(code,
                                    language=args.language,
                                    session=sess,
                                    **kwargs)

        # show result
        if submission is None:
            log.failure("submission failed")
        else:
            if args.open:
                if args.open_browser:
                    browser = args.open_browser
                else:
                    for browser in default_url_opener:
                        if shutil.which(browser):
                            break
                    else:
                        browser = None
                        log.failure(
                            "couldn't find browsers to open the url. please specify a browser"
                        )
                if browser:
                    log.info("open the submission page with: %s", browser)
                    subprocess.check_call(
                        [browser, submission.get_url()],
                        stdin=sys.stdin,
                        stdout=sys.stdout,
                        stderr=sys.stderr,
                    )
Beispiel #11
0
def submit(args: 'argparse.Namespace') -> None:
    # guess url
    history = onlinejudge.implementation.download_history.DownloadHistory()
    if args.file.parent.resolve() == pathlib.Path.cwd():
        guessed_urls = history.get()
    else:
        log.warning(
            'cannot guess URL since the given file is not in the current directory'
        )
        guessed_urls = []
    if args.url is None:
        if len(guessed_urls) == 1:
            args.url = guessed_urls[0]
            log.info('guessed problem: %s', args.url)
        else:
            log.error('failed to guess the URL to submit')
            log.info('please manually specify URL as: $ oj submit URL FILE')
            sys.exit(1)

    # parse url
    problem = onlinejudge.dispatch.problem_from_url(args.url)
    if problem is None:
        sys.exit(1)

    # read code
    with args.file.open('rb') as fh:
        code = fh.read()  # type: bytes
    format_config = {
        'dos2unix': args.format_dos2unix or args.golf,
        'rstrip': args.format_dos2unix or args.golf,
    }
    code = format_code(code, **format_config)

    # report code
    try:
        s = code.decode()
    except UnicodeDecodeError as e:
        log.failure('%s: %s', e.__class__.__name__, str(e))
        s = repr(code)[1:]
    log.info('code (%d byte):', len(code))
    lines = s.splitlines(keepends=True)
    if len(lines) < 30:
        log.emit(log.bold(s))
    else:
        log.emit(log.bold(''.join(lines[:10])))
        log.emit('... (%s lines) ...', len(lines[10:-10]))
        log.emit(log.bold(''.join(lines[-10:])))

    with utils.with_cookiejar(utils.new_default_session(),
                              path=args.cookie) as sess:
        # guess or select language ids
        langs = problem.get_language_dict(session=sess)
        matched_lang_ids = None  # type: Optional[List[str]]
        if args.language in langs:
            matched_lang_ids = [args.language]
        else:
            if args.guess:
                kwargs = {
                    'language_dict': langs,
                    'cxx_latest': args.guess_cxx_latest,
                    'cxx_compiler': args.guess_cxx_compiler,
                    'python_version': args.guess_python_version,
                    'python_interpreter': args.guess_python_interpreter,
                }
                matched_lang_ids = guess_lang_ids_of_file(
                    args.file, code, **kwargs)
                if not matched_lang_ids:
                    log.info('failed to guess languages from the file name')
                    matched_lang_ids = list(langs.keys())
                if args.language is not None:
                    log.info(
                        'you can use `--no-guess` option if you want to do an unusual submission'
                    )
                    matched_lang_ids = select_ids_of_matched_languages(
                        args.language.split(),
                        matched_lang_ids,
                        language_dict=langs)
            else:
                if args.language is None:
                    matched_lang_ids = None
                else:
                    matched_lang_ids = select_ids_of_matched_languages(
                        args.language.split(),
                        list(langs.keys()),
                        language_dict=langs)

        # report selected language ids
        if matched_lang_ids is not None and len(matched_lang_ids) == 1:
            args.language = matched_lang_ids[0]
            log.info('chosen language: %s (%s)', args.language,
                     langs[args.language]['description'])
        else:
            if matched_lang_ids is None:
                log.error('language is unknown')
                log.info('supported languages are:')
            elif len(matched_lang_ids) == 0:
                log.error('no languages are matched')
                log.info('supported languages are:')
            else:
                log.error('Matched languages were not narrowed down to one.')
                log.info('You have to choose:')
            for lang_id in sorted(matched_lang_ids or langs.keys()):
                log.emit('%s (%s)', lang_id, langs[lang_id]['description'])
            sys.exit(1)

        # confirm
        guessed_unmatch = ([problem.get_url()] != guessed_urls)
        if guessed_unmatch:
            samples_text = ('samples of "{}'.format('", "'.join(guessed_urls))
                            if guessed_urls else 'no samples')
            log.warning(
                'the problem "%s" is specified to submit, but %s were downloaded in this directory. this may be mis-operation',
                problem.get_url(), samples_text)
        if args.wait:
            log.status('sleep(%.2f)', args.wait)
            time.sleep(args.wait)
        if not args.yes:
            if guessed_unmatch:
                problem_id = problem.get_url().rstrip('/').split(
                    '/')[-1].split('?')[-1]  # this is too ad-hoc
                key = problem_id[:3] + (problem_id[-1]
                                        if len(problem_id) >= 4 else '')
                sys.stdout.write('Are you sure? Please type "{}" '.format(key))
                sys.stdout.flush()
                c = sys.stdin.readline().rstrip()
                if c != key:
                    log.info('terminated.')
                    return
            else:
                sys.stdout.write('Are you sure? [y/N] ')
                sys.stdout.flush()
                c = sys.stdin.read(1)
                if c.lower() != 'y':
                    log.info('terminated.')
                    return

        # submit
        kwargs = {}
        if problem.get_service().get_name() == 'topcoder':
            if args.full_submission:
                kwargs['kind'] = 'full'
            else:
                kwargs['kind'] = 'example'
        try:
            submission = problem.submit_code(code,
                                             language=args.language,
                                             session=sess,
                                             **kwargs)  # type: ignore
        except onlinejudge.type.SubmissionError:
            log.failure('submission failed')
            sys.exit(1)

        # show result
        if args.open:
            if args.open_browser:
                browser = args.open_browser
            else:
                for browser in default_url_opener:
                    if shutil.which(browser):
                        break
                else:
                    browser = None
                    log.failure(
                        'couldn\'t find browsers to open the url. please specify a browser'
                    )
            if browser:
                log.status('open the submission page with: %s', browser)
                subprocess.check_call([browser, submission.get_url()],
                                      stdin=sys.stdin,
                                      stdout=sys.stdout,
                                      stderr=sys.stderr)