Source code for codeforces_core.contest_register
from dataclasses import dataclass
from enum import Enum
from typing import List, cast
from lxml import html
from lxml.etree import _Element
from .interfaces.AioHttpHelper import AioHttpHelperInterface
from . import util
[docs]class RegisterResultMsg(str, Enum):
HaveBeenRegistered = 'You have been successfully registered' # first time message
AlreadyRegistered = 'You are already registered for the contest'
NoRegistrationIsOpenedNow = 'No registration is opened now'
Empty = ''
[docs]@dataclass
class RegisterResult:
title: str = ''
msg: RegisterResultMsg = RegisterResultMsg.Empty # example: already register, TODO 有些比赛会 None
# TODO 统一参数命名
# Take part as individual participant
[docs]async def async_register(http: AioHttpHelperInterface, contest_id: str, **kw) -> RegisterResult:
"""
This method will use ``http`` for register request, you need login before
:param contest_id: Codeforces contest_id in url
:returns: the result
Examples:
.. code-block::
import asyncio
from codeforces_core.account import async_login
from codeforces_core.httphelper import HttpHelper
from codeforces_core.contest_register import async_register, RegisterResultMsg
async def demo():
# http = HttpHelper(token_path='/tmp/cache_token', cookie_jar_path='/tmp/cache_cookie_jar')
http = HttpHelper(token_path='', cookie_jar_path='')
await http.open_session()
result = await async_login(http=http, handle='<handle>', password='<password>')
assert(result.success)
result = await async_register(http=http,contest_id='1811')
print(result)
# assert result.msg == RegisterResultMsg.HaveBeenRegistered
# assert result.msg == RegisterResultMsg.AlreadyRegistered
# assert result.msg == RegisterResultMsg.NoRegistrationIsOpenedNow
await http.close_session()
asyncio.run(demo())
"""
url = f'/contestRegistration/{contest_id}'
resp = await http.async_get(url)
doc = html.fromstring(resp)
title = cast(List[_Element], doc.xpath('.//title'))[0].text
msg = util.show_message(resp) # AlreadyRegistered
if msg:
return RegisterResult(title=title, msg=msg)
token = http.get_tokens()
resp = await http.async_post(
url,
data=http.create_form({
'csrf_token': token['csrf'],
'action': 'formSubmitted',
'takePartAs': 'personal', # Take part as individual participant
'backUrl': '',
}))
msg = util.show_message(resp) # HaveBeenRegistered
return RegisterResult(title=title, msg=msg)