diff --git a/.github/workflows/ldb-ci.yml b/.github/workflows/ldb-ci.yml new file mode 100644 index 0000000..ef7925f --- /dev/null +++ b/.github/workflows/ldb-ci.yml @@ -0,0 +1,30 @@ +name: Leetcode Daily Bot CI + +on: + pull_request: + push: + branches: + - "main" + + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: Set up Python + # This is the version of the action for setting up Python, not the Python version. + uses: actions/setup-python@v5 + with: + # Semantic version range syntax or exact version of a Python version + python-version: '3.12' + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install -r requirements.txt + - name: Test + run: | + pip install pytest + pytest tests diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..a635c5c --- /dev/null +++ b/pytest.ini @@ -0,0 +1,2 @@ +[pytest] +pythonpath = . diff --git a/requirements.txt b/requirements.txt index d11af65..56fa417 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,3 +3,5 @@ fastapi jinja2 pymongo python-dotenv +requests +pydantic diff --git a/src/__init__.py b/src/__init__.py index 93f5256..e69de29 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -1 +0,0 @@ -__init__.py \ No newline at end of file diff --git a/src/bot.py b/src/bot.py index 083502b..777e2e1 100644 --- a/src/bot.py +++ b/src/bot.py @@ -1,7 +1,7 @@ from datetime import datetime from pydantic import BaseModel import requests -from src.common import submission_link +from src.common import submission_link, extract_submission_id LEETCODE_DAILY_GROUP_ID = '-1002270137956' @@ -44,23 +44,24 @@ def process_message(bot, db, data): name = f'{first_name} ({username})' if text.startswith('/start') or text.startswith('/help'): - bot.send_message(chat_id, "Please, send me a submission id for today's daily challenge") - elif text.isnumeric(): - submission_id = text + bot.send_message(chat_id, "Please, send me a submission id or a link to a submission for today's daily challenge") + return + + submission_id = extract_submission_id(text.strip()) - if submission_id.isnumeric(): + if submission_id: print(f"Will update submissions for {username} on {today}: {text}") result = db.submissions.update_one( {'username': name, 'date': today, 'chat_id': chat_id}, - {'$set': {'text': text}}, + {'$set': {'text': submission_id}}, True, ) - print(username, today, text, result) - bot.send_message(chat_id, f"Updated submission for {today}: {submission_link(text)}") - bot.send_message(LEETCODE_DAILY_GROUP_ID, f"New submission from {name}: {submission_link(text)}") + print(username, today, submission_id, result) + bot.send_message(chat_id, f"Updated submission for {today}: {submission_link(submission_id)}") + bot.send_message(LEETCODE_DAILY_GROUP_ID, f"New submission from {name}: {submission_link(submission_id)}") else: - bot.send_message(chat_id, "Incorrect input! please send me a submission id") + bot.send_message(chat_id, "Incorrect input! Please, send me a submission id or a link to a submission") raise ValueError(f"Incorrect link {data}") except Exception as e: diff --git a/src/common.py b/src/common.py index b377e95..e0e2fab 100644 --- a/src/common.py +++ b/src/common.py @@ -1,2 +1,22 @@ +import re + + def submission_link(submission_id): return f'https://leetcode.com/submissions/detail/{submission_id}' + + +def extract_submission_id(text: str) -> str: + if text.isnumeric(): + return text + + for link_pattern in ( + r'https://leetcode.com/submissions/detail/\d+/?$', + r'https://leetcode.com/problems/[a-zA-Z0-9-]+/submissions/\d+/?$' + ): + p = re.compile(link_pattern) + if match := p.search(text): + link = match.group() + # we do know that an id exists here, as each pattern has \d+ qualifier + return re.findall(r'\d+', link)[-1] + + return '' diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..35c5eb0 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,31 @@ +from src.common import submission_link, extract_submission_id + + +def test_submission_link(): + assert submission_link(123) == 'https://leetcode.com/submissions/detail/123' + + +def test_extract_submission_id(): + assert extract_submission_id('1242352') == '1242352' + assert extract_submission_id('1') == '1' + + assert extract_submission_id('https://leetcode.com/submissions/detail/123') == '123' + assert extract_submission_id('https://leetcode.com/submissions/detail/123/') == '123' + assert extract_submission_id('https://leetcode.com/submissions/detail/1') == '1' + + assert extract_submission_id('https://leetcode.com/problems/two-sum/submissions/123') == '123' + assert extract_submission_id('https://leetcode.com/problems/two-sum/submissions/123/') == '123' + assert extract_submission_id('https://leetcode.com/problems/two-sum/submissions/1/') == '1' + assert extract_submission_id('https://leetcode.com/problems/some-longer-problem-here/submissions/123') == '123' + assert extract_submission_id('https://leetcode.com/problems/problem-with-69-numbers/submissions/123/') == '123' + assert extract_submission_id('https://leetcode.com/problems/ii-112-645-32-sdfwsd-435-sad/submissions/123') == '123' + assert extract_submission_id('https://leetcode.com/problems/a/submissions/123') == '123' + + assert not extract_submission_id('') + assert not extract_submission_id('awewaefaw') + assert not extract_submission_id(' ') + assert not extract_submission_id('https://leetcode.com/submissions/detail/') + assert not extract_submission_id('https://leetcode.com/problems/two-sum/submissions/') + assert not extract_submission_id('https://leetcode.com/problems/54323423') + assert not extract_submission_id('https://leetcode.com/problems/submissions/123') + assert not extract_submission_id('https://leetcode.com/problems//submissions/123')