From 04418d55165fc9b45c781a5f2f7839cc19c76fce Mon Sep 17 00:00:00 2001 From: Fiber Date: Wed, 12 Feb 2025 15:14:20 +0800 Subject: [PATCH] v0.1 --- .gitignore | 162 ++++++++++++++++++ README.md | 1 + pyproject.toml | 12 ++ .../__init__.py | 60 +++++++ tests/__init__.py | 0 5 files changed, 235 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 pyproject.toml create mode 100644 src/nonebot_plugin_competition_rank/__init__.py create mode 100644 tests/__init__.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..3a8816c --- /dev/null +++ b/.gitignore @@ -0,0 +1,162 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm-project.org/#use-with-ide +.pdm.toml +.pdm-python +.pdm-build/ + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ diff --git a/README.md b/README.md new file mode 100644 index 0000000..f916f28 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# nonebot_plugin_competition_rank diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..06bb673 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,12 @@ +[project] +name = "nonebot_plugin_competition_rank" +version = "0.1" +description = "Default template for PDM package" +authors = [ + {name = "Fiber", email = "leaf@airo.cc"}, +] +dependencies = [] +requires-python = ">=3.12" +readme = "README.md" +license = {text = "MIT"} + diff --git a/src/nonebot_plugin_competition_rank/__init__.py b/src/nonebot_plugin_competition_rank/__init__.py new file mode 100644 index 0000000..d83e5fc --- /dev/null +++ b/src/nonebot_plugin_competition_rank/__init__.py @@ -0,0 +1,60 @@ +import json +from nonebot import on_command +from nonebot.adapters.onebot.v11 import Bot, Event + +def read_json_file(file_path): + with open(file_path, 'r', encoding='utf-8') as file: + data = json.load(file) + return data + +def save_json_file(file_path, data): + with open(file_path, 'w', encoding='utf-8') as file: + json.dump(data, file, ensure_ascii=False, indent=4) + +def get_user_answer_counts(data): + user_counts = {} + for answers in data.values(): + for user_id in answers: + if user_id in user_counts: + user_counts[user_id] += 1 + else: + user_counts[user_id] = 1 + return user_counts + +def sort_users_by_answers(user_counts): + return sorted(user_counts.items(), key=lambda x: x[1], reverse=True) + +data_path = "./data/competition_rank.json" + +to_answer = on_command("答") + +@to_answer.handle() +async def handle_answer(bot: Bot, event: Event): + user_id = event.get_user_id() + message = str(event.get_message()).strip() + data = read_json_file(data_path) + for ans in data.keys(): + if ans in message and not data[ans]: # Check if the answer list is empty + data[ans].append(user_id) + save_json_file(data_path, data) # Save the updated data + name_data = await bot.call_api( + "get_stranger_info", **{"user_id": user_id, "no_cache": False} + ) + nickname = name_data["nickname"] + await bot.send(event, nickname + "回答正确!") + +to_calculate = on_command("统计") + +@to_calculate.handle() +async def handle_statistics(bot: Bot, event: Event): + data = read_json_file(data_path) + user_counts = get_user_answer_counts(data) + sorted_users = sort_users_by_answers(user_counts) + message = "答题排行榜:\n" + for user_id, count in sorted_users: + name_data = await bot.call_api( + "get_stranger_info", **{"user_id": user_id, "no_cache": False} + ) + nickname = name_data["nickname"] + message += f"{nickname}: {count} 次\n" + await bot.send(event, message) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29