Compare commits

..

46 Commits

Author SHA1 Message Date
477865dd29 Merge pull request 'Update dependency twine to v6.2.0' (#246) from renovate/twine-6.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 53s
Reviewed-on: #246
2025-09-05 09:04:34 +03:00
5ced446fee Update dependency twine to v6.2.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 52s
Tests / Build and Test (3.11) (pull_request) Successful in 1m17s
Tests / Build and Test (3.12) (pull_request) Successful in 1m18s
Tests / Build and Test (3.13) (pull_request) Successful in 1m11s
2025-09-04 22:07:57 +03:00
d60866f1a8 Merge pull request 'Update dependency tox to v4.30.2' (#247) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 55s
Reviewed-on: #247
2025-09-04 21:07:52 +03:00
9aafc53a5c Update dependency tox to v4.30.2
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 52s
Tests / Build and Test (3.11) (pull_request) Successful in 1m16s
Tests / Build and Test (3.12) (pull_request) Successful in 1m17s
Tests / Build and Test (3.13) (pull_request) Successful in 1m11s
2025-09-04 20:03:28 +03:00
73791d065a Merge pull request 'Update dependency pytest to v8.4.2' (#245) from renovate/pytest-8.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 56s
Reviewed-on: #245
2025-09-04 18:43:03 +03:00
d17902eb09 Update dependency pytest to v8.4.2
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 48s
Tests / Build and Test (3.11) (pull_request) Successful in 1m16s
Tests / Build and Test (3.12) (pull_request) Successful in 1m17s
Tests / Build and Test (3.13) (pull_request) Successful in 1m12s
2025-09-04 17:55:55 +03:00
90d0eb150c Merge pull request 'Update dependency tox to v4.30.1' (#244) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 54s
Reviewed-on: #244
2025-09-03 18:36:45 +03:00
150c06072a Update dependency tox to v4.30.1
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 49s
Tests / Build and Test (3.11) (pull_request) Successful in 1m17s
Tests / Build and Test (3.12) (pull_request) Successful in 1m15s
Tests / Build and Test (3.13) (pull_request) Successful in 1m9s
2025-09-03 18:08:17 +03:00
37d2d4e215 Merge pull request 'Update dependency tox to v4.29.0' (#243) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 56s
Reviewed-on: #243
2025-08-30 18:22:25 +03:00
4601a7afa2 Update dependency tox to v4.29.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 59s
Tests / Build and Test (3.11) (pull_request) Successful in 1m16s
Tests / Build and Test (3.12) (pull_request) Successful in 1m15s
Tests / Build and Test (3.13) (pull_request) Successful in 1m12s
2025-08-30 02:33:55 +03:00
2bcc1f94f0 Update dependency typing-extensions to ~=4.15.0 (#242)
All checks were successful
Analysis / SonarCloud (push) Successful in 57s
2025-08-25 20:06:36 +03:00
f0532f9d39 Update dependency typing-extensions to ~=4.15.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 53s
Tests / Build and Test (3.11) (pull_request) Successful in 1m16s
Tests / Build and Test (3.12) (pull_request) Successful in 1m14s
Tests / Build and Test (3.13) (pull_request) Successful in 1m9s
2025-08-25 17:11:20 +03:00
97ac53b597 Update dependency types-aiofiles to v24.1.0.20250822 (#241)
All checks were successful
Analysis / SonarCloud (push) Successful in 1m10s
2025-08-22 18:13:26 +03:00
e94baabcfe Update dependency types-aiofiles to v24.1.0.20250822
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 1m31s
Tests / Build and Test (3.11) (pull_request) Successful in 1m17s
Tests / Build and Test (3.12) (pull_request) Successful in 1m14s
Tests / Build and Test (3.13) (pull_request) Successful in 1m12s
2025-08-22 17:59:28 +03:00
c3b8eca06f Merge pull request 'Update dependency ujson to ~=5.11.0' (#238) from renovate/ujson-5.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 52s
Reviewed-on: #238
2025-08-22 16:41:59 +03:00
d207c564dc Merge pull request 'Update dependency types-ujson to v5.10.0.20250822' (#240) from renovate/types-ujson-5.x into dev
Some checks failed
Analysis / SonarCloud (push) Has been cancelled
Reviewed-on: #240
2025-08-22 16:41:15 +03:00
e4807e2999 Update dependency types-ujson to v5.10.0.20250822
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 48s
Tests / Build and Test (3.11) (pull_request) Successful in 1m11s
Tests / Build and Test (3.12) (pull_request) Successful in 1m10s
Tests / Build and Test (3.13) (pull_request) Successful in 1m6s
2025-08-22 06:37:11 +03:00
540c94c0ed Update dependency ujson to ~=5.11.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 1m53s
Tests / Build and Test (3.11) (pull_request) Successful in 1m26s
Tests / Build and Test (3.12) (pull_request) Successful in 1m25s
Tests / Build and Test (3.13) (pull_request) Successful in 1m22s
2025-08-20 15:21:10 +03:00
a10c4a8f51 Merge pull request 'Update dependency types-aiofiles to v24.1.0.20250809' (#236) from renovate/types-aiofiles-24.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 55s
Reviewed-on: #236
2025-08-12 15:44:04 +03:00
9e40f89d67 Merge pull request 'Update dependency pylint to v3.3.8' (#237) from renovate/pylint-3.x into dev
Some checks failed
Analysis / SonarCloud (push) Has been cancelled
Reviewed-on: #237
2025-08-12 15:43:53 +03:00
f5db3cb529 Update dependency pylint to v3.3.8
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 44s
Tests / Build and Test (3.11) (pull_request) Successful in 1m21s
Tests / Build and Test (3.12) (pull_request) Successful in 1m20s
Tests / Build and Test (3.13) (pull_request) Successful in 1m13s
2025-08-09 13:13:34 +03:00
eca59e4673 Update dependency types-aiofiles to v24.1.0.20250809
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 43s
Tests / Build and Test (3.11) (pull_request) Successful in 1m20s
Tests / Build and Test (3.12) (pull_request) Successful in 1m19s
Tests / Build and Test (3.13) (pull_request) Successful in 1m11s
2025-08-09 07:02:37 +03:00
923bad856b Merge pull request 'Update dependency redis to ~=6.4.0' (#235) from renovate/redis-6.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 56s
Reviewed-on: #235
2025-08-07 12:10:17 +03:00
902ccb5947 Update dependency redis to ~=6.4.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 57s
Tests / Build and Test (3.11) (pull_request) Successful in 1m24s
Tests / Build and Test (3.12) (pull_request) Successful in 1m22s
Tests / Build and Test (3.13) (pull_request) Successful in 1m12s
2025-08-07 11:48:03 +03:00
1fea7ea5f8 Merge pull request 'Update dependency redis to ~=6.3.0' (#234) from renovate/redis-6.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 50s
Reviewed-on: #234
2025-08-05 11:50:40 +03:00
37928baa6f Update dependency redis to ~=6.3.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 50s
Tests / Build and Test (3.11) (pull_request) Successful in 1m24s
Tests / Build and Test (3.12) (pull_request) Successful in 1m20s
Tests / Build and Test (3.13) (pull_request) Successful in 1m12s
2025-08-05 11:25:32 +03:00
1f28b1771a Merge pull request 'Update dependency build to v1.3.0' (#233) from renovate/build-1.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 1m2s
Reviewed-on: #233
2025-08-02 02:07:53 +03:00
5b677f6741 Update dependency build to v1.3.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 1m8s
Tests / Build and Test (3.11) (pull_request) Successful in 1m38s
Tests / Build and Test (3.12) (pull_request) Successful in 1m39s
Tests / Build and Test (3.13) (pull_request) Successful in 1m31s
2025-08-02 01:06:48 +03:00
883cd50fb3 Merge pull request 'Update dependency types-aiofiles to v24.1.0.20250801' (#232) from renovate/types-aiofiles-24.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 54s
Reviewed-on: #232
2025-08-01 10:11:09 +03:00
403b52042e Update dependency types-aiofiles to v24.1.0.20250801
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 43s
Tests / Build and Test (3.11) (pull_request) Successful in 1m21s
Tests / Build and Test (3.12) (pull_request) Successful in 1m20s
Tests / Build and Test (3.13) (pull_request) Successful in 1m12s
2025-08-01 07:37:03 +03:00
5ca813b095 Merge pull request 'Update dependency tox to v4.28.4' (#231) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 52s
Reviewed-on: #231
2025-08-01 00:53:00 +03:00
b8cd7f2316 Update dependency tox to v4.28.4
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 47s
Tests / Build and Test (3.11) (pull_request) Successful in 1m20s
Tests / Build and Test (3.12) (pull_request) Successful in 1m19s
Tests / Build and Test (3.13) (pull_request) Successful in 1m10s
2025-08-01 00:24:04 +03:00
454c80ad6b Merge pull request 'Update dependency mypy to v1.17.1' (#230) from renovate/mypy-1.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 54s
Reviewed-on: #230
2025-07-31 14:34:47 +03:00
1bbab5c154 Update dependency mypy to v1.17.1
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 46s
Tests / Build and Test (3.11) (pull_request) Successful in 1m20s
Tests / Build and Test (3.12) (pull_request) Successful in 1m19s
Tests / Build and Test (3.13) (pull_request) Successful in 1m14s
2025-07-31 10:59:00 +03:00
6cb7f9b2f3 Merge pull request 'Update dependency tox to v4.28.3' (#229) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 52s
Reviewed-on: #229
2025-07-26 12:32:43 +03:00
a4c797079e Update dependency tox to v4.28.3
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 51s
Tests / Build and Test (3.11) (pull_request) Successful in 1m15s
Tests / Build and Test (3.12) (pull_request) Successful in 1m16s
Tests / Build and Test (3.13) (pull_request) Successful in 1m10s
2025-07-26 03:50:04 +03:00
9a9edbc1a8 Merge pull request 'Update dependency tox to v4.28.1' (#228) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 52s
Reviewed-on: #228
2025-07-23 17:41:14 +03:00
f991d86d4a Update dependency tox to v4.28.1
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 47s
Tests / Build and Test (3.11) (pull_request) Successful in 1m14s
Tests / Build and Test (3.12) (pull_request) Successful in 1m13s
Tests / Build and Test (3.13) (pull_request) Successful in 1m10s
2025-07-23 10:07:52 +03:00
cea1b087d3 Merge pull request 'Update dependency tox to v4.28.0' (#227) from renovate/tox-4.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 53s
Reviewed-on: #227
2025-07-21 00:52:28 +03:00
19399fe0ac Update dependency tox to v4.28.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 44s
Tests / Build and Test (3.11) (pull_request) Successful in 1m17s
Tests / Build and Test (3.12) (pull_request) Successful in 1m20s
Tests / Build and Test (3.13) (pull_request) Successful in 1m8s
2025-07-20 21:36:44 +03:00
6da6812d1d Merge pull request 'Update dependency pytest-asyncio to v1.1.0' (#226) from renovate/pytest-asyncio-1.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 1m2s
Reviewed-on: #226
2025-07-16 17:29:52 +03:00
ec3dc3a42a Update dependency pytest-asyncio to v1.1.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 41s
Tests / Build and Test (3.11) (pull_request) Successful in 1m14s
Tests / Build and Test (3.12) (pull_request) Successful in 1m14s
Tests / Build and Test (3.13) (pull_request) Successful in 1m9s
2025-07-16 07:53:38 +03:00
01dc9f5d87 Merge pull request 'Update dependency mypy to v1.17.0' (#225) from renovate/mypy-1.x into dev
All checks were successful
Analysis / SonarCloud (push) Successful in 55s
Reviewed-on: #225
2025-07-15 03:09:26 +03:00
aa38fc5f0f Update dependency mypy to v1.17.0
All checks were successful
Analysis / SonarCloud (pull_request) Successful in 52s
Tests / Build and Test (3.11) (pull_request) Successful in 1m15s
Tests / Build and Test (3.12) (pull_request) Successful in 1m15s
Tests / Build and Test (3.13) (pull_request) Successful in 1m9s
2025-07-15 00:05:40 +03:00
097581bac7 Bump version to 4.4.0
All checks were successful
Analysis / SonarCloud (push) Successful in 50s
Analysis / SonarCloud (pull_request) Successful in 47s
Tests / Build and Test (3.11) (pull_request) Successful in 1m11s
Tests / Build and Test (3.12) (pull_request) Successful in 1m14s
Tests / Build and Test (3.13) (pull_request) Successful in 1m6s
2025-07-09 14:43:57 +02:00
b8bbba66ec Fixed default_ttl_seconds being passed in a wrong call
Some checks failed
Analysis / SonarCloud (push) Has been cancelled
2025-07-09 14:43:20 +02:00
19 changed files with 113 additions and 315 deletions

View File

@@ -1,20 +0,0 @@
# Minimal makefile for Sphinx documentation
#
# You can set these variables from the command line, and also
# from the environment for the first two.
SPHINXOPTS ?=
SPHINXBUILD ?= sphinx-build
SOURCEDIR = .
BUILDDIR = _build
# Put it first so that "make" without argument is like "make help".
help:
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
.PHONY: help Makefile
# Catch-all target: route all unknown targets to Sphinx using the new
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
%: Makefile
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)

View File

@@ -1,61 +0,0 @@
# Configuration file for the Sphinx documentation builder.
#
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
import os
import sys
from datetime import datetime
from typing import List, Dict, Any
import libbot
sys.path.insert(0, os.path.abspath(".."))
# -- Project information -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
project: str = "LibBotUniversal"
author: str = libbot.__author__
version: str = libbot.__version__
release: str = version
copyright: str = f"{datetime.now().year} {author}"
html_title: str = f"{project} v{version} Documentation"
# -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions: List[str] = [
"sphinx.ext.autodoc",
"sphinx.ext.autosummary",
"sphinx.ext.viewcode",
"sphinx.ext.viewcode",
"sphinx.ext.napoleon",
"sphinx_copybutton",
]
templates_path: List[str] = ["_templates"]
exclude_patterns: List[str] = ["_build", "Thumbs.db", ".DS_Store"]
# -- Options for HTML output -------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
html_theme: str = "furo"
html_static_path: List[str] = ["_static"]
html_theme_options: Dict[str, Any] = {
"source_repository": "https://git.end-play.xyz/profitroll/LibBotUniversal",
"source_branch": "main",
"source_directory": "docs/",
"light_css_variables": {
"font-stack": "'Outfit', sans-serif",
},
}
resource_links: Dict[str, Any] = {
"issues": "https://git.end-play.xyz/profitroll/LibBotUniversal/issues",
"examples": "https://git.end-play.xyz/profitroll/LibBotUniversal/tree/main/examples",
}

View File

@@ -1,29 +0,0 @@
Welcome to LibBotUniversal
=============================
LibBotUniversal (AKA libbot) simplifies development and maintenance of different chatbots.
Getting started
*****************************
There are a few pages to take a look at if you're just getting started.
* Installing the library
* Creating your first bot
* Examples of different bots
Getting help
*****************************
If you are looking for help or want to report a bug, we got you covered.
* Bug reports are being submitted on the repo's issue tracker.
Package
*****************************
.. toctree::
:maxdepth: 1
:caption: API reference
modules

View File

@@ -1,35 +0,0 @@
@ECHO OFF
pushd %~dp0
REM Command file for Sphinx documentation
if "%SPHINXBUILD%" == "" (
set SPHINXBUILD=sphinx-build
)
set SOURCEDIR=.
set BUILDDIR=_build
%SPHINXBUILD% >NUL 2>NUL
if errorlevel 9009 (
echo.
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
echo.installed, then set the SPHINXBUILD environment variable to point
echo.to the full path of the 'sphinx-build' executable. Alternatively you
echo.may add the Sphinx directory to PATH.
echo.
echo.If you don't have Sphinx installed, grab it from
echo.https://www.sphinx-doc.org/
exit /b 1
)
if "%1" == "" goto help
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
goto end
:help
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
:end
popd

View File

@@ -1,7 +0,0 @@
libbot
======
.. toctree::
:maxdepth: 5
libbot

View File

@@ -28,7 +28,6 @@ dependencies = { file = "requirements/_.txt" }
[tool.setuptools.dynamic.optional-dependencies] [tool.setuptools.dynamic.optional-dependencies]
dev = { file = "requirements/dev.txt" } dev = { file = "requirements/dev.txt" }
docs = { file = "requirements/docs.txt" }
pycord = { file = "requirements/pycord.txt" } pycord = { file = "requirements/pycord.txt" }
pyrogram = { file = "requirements/pyrogram.txt" } pyrogram = { file = "requirements/pyrogram.txt" }
speed = { file = "requirements/speed.txt" } speed = { file = "requirements/speed.txt" }

View File

@@ -1,2 +1,2 @@
aiofiles>=23.0.0 aiofiles>=23.0.0
typing-extensions~=4.14.0 typing-extensions~=4.15.0

View File

@@ -1,2 +1,2 @@
pymemcache~=4.0.0 pymemcache~=4.0.0
redis~=6.2.0 redis~=6.4.0

View File

@@ -1,12 +1,12 @@
black==25.1.0 black==25.1.0
build==1.2.2.post1 build==1.3.0
isort==5.13.2 isort==5.13.2
mypy==1.16.1 mypy==1.17.1
pylint==3.3.7 pylint==3.3.8
pytest-asyncio==1.0.0 pytest-asyncio==1.1.0
pytest-cov==6.2.1 pytest-cov==6.2.1
pytest==8.4.1 pytest==8.4.2
tox==4.27.0 tox==4.30.2
twine==6.1.0 twine==6.2.0
types-aiofiles==24.1.0.20250708 types-aiofiles==24.1.0.20250822
types-ujson==5.10.0.20250326 types-ujson==5.10.0.20250822

View File

@@ -1,3 +0,0 @@
furo==2024.8.6
sphinx==8.1.3
sphinx_copybutton==0.5.2

View File

@@ -1 +1 @@
ujson~=5.10.0 ujson~=5.11.0

View File

@@ -1,4 +1,4 @@
__version__ = "4.3.0" __version__ = "4.4.0"
__license__ = "GPL3" __license__ = "GPL3"
__author__ = "Profitroll" __author__ = "Profitroll"

View File

@@ -29,7 +29,7 @@ class CacheMemcached(Cache):
"Cache configuration is invalid. Please check if all keys are set (engine: memcached)" "Cache configuration is invalid. Please check if all keys are set (engine: memcached)"
) )
return cls(Client(engine_config["uri"], default_noreply=True, default_ttl_seconds=default_ttl_seconds), prefix=prefix) return cls(Client(engine_config["uri"], default_noreply=True), prefix=prefix, default_ttl_seconds=default_ttl_seconds)
def _get_prefixed_key(self, key: str) -> str: def _get_prefixed_key(self, key: str) -> str:
return key if self.prefix is None else f"{self.prefix}_{key}" return key if self.prefix is None else f"{self.prefix}_{key}"

View File

@@ -4,8 +4,8 @@ from typing import Any, List, Optional
class ConfigKeyError(Exception): class ConfigKeyError(Exception):
"""Raised when config key is not found. """Raised when config key is not found.
Args: ### Attributes:
key (str | List[str]): Missing config key * key (`str | List[str]`): Missing config key.
""" """
def __init__(self, key: str | List[str]) -> None: def __init__(self, key: str | List[str]) -> None:
@@ -21,9 +21,9 @@ class ConfigKeyError(Exception):
class ConfigValueError(Exception): class ConfigValueError(Exception):
"""Raised when config key's value is invalid. """Raised when config key's value is invalid.
Args: ### Attributes:
key (str | List[str]): Invalid config key * key (`str | List[str]`): Invalid config key.
value (Optional[Any]): Key's correct value * value (`Optional[Any]`): Key's correct value.
""" """
def __init__(self, key: str | List[str], value: Optional[Any] = None) -> None: def __init__(self, key: str | List[str], value: Optional[Any] = None) -> None:

View File

@@ -18,16 +18,16 @@ def _(
locale: str | None = "en", locale: str | None = "en",
locales_root: str | Path = Path("locale"), locales_root: str | Path = Path("locale"),
) -> Any: ) -> Any:
"""Get value of the locale string. """Get value of locale string.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
locale (str | None): Locale to be looked up in. Defaults to `"en"` locale (str | None): Locale to looked up in. Defaults to "en".
locales_root (str | Path, optional):Folder where locales are located. Defaults to `Path("locale")` locales_root (str | Path, optional): Folder where locales are located. Defaults to Path("locale").
Returns: Returns:
Any: Value of provided locale key. Is usually `str`, `Dict[str, Any]` or `List[Any]` Any: Value of provided locale key. Is usually `str`, `Dict[str, Any]` or `List[Any]`.
""" """
if locale is None: if locale is None:
locale: str = config_get("locale") locale: str = config_get("locale")
@@ -58,16 +58,16 @@ async def _(
locale: str | None = "en", locale: str | None = "en",
locales_root: str | Path = Path("locale"), locales_root: str | Path = Path("locale"),
) -> Any: ) -> Any:
"""Get value of the locale string. """Get value of locale string.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
locale (str | None): Locale to be looked up in. Defaults to `"en"` locale (str | None): Locale to looked up in. Defaults to "en".
locales_root (str | Path, optional):Folder where locales are located. Defaults to `Path("locale")` locales_root (str | Path, optional): Folder where locales are located. Defaults to Path("locale").
Returns: Returns:
Any: Value of provided locale key. Is usually `str`, `Dict[str, Any]` or `List[Any]` Any: Value of provided locale key. Is usually `str`, `Dict[str, Any]` or `List[Any]`.
""" """
locale: str = config_get("locale") if locale is None else locale locale: str = config_get("locale") if locale is None else locale
@@ -97,13 +97,14 @@ def in_all_locales(key: str, *args: str, locales_root: str | Path = Path("locale
"""Get value of the provided key and path in all available locales. """Get value of the provided key and path in all available locales.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
locales_root (str | Path, optional): Folder where locales are located. Defaults to `Path("locale")` locales_root (str | Path, optional): Folder where locales are located. Defaults to `Path("locale")`.
Returns: Returns:
List[Any]: List of values in all locales List[Any]: List of values in all locales.
""" """
output: List[Any] = [] output: List[Any] = []
for locale in _get_valid_locales(locales_root): for locale in _get_valid_locales(locales_root):
@@ -130,12 +131,12 @@ async def in_all_locales(key: str, *args: str, locales_root: str | Path = Path("
"""Get value of the provided key and path in all available locales. """Get value of the provided key and path in all available locales.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
locales_root (str | Path, optional): Folder where locales are located. Defaults to `Path("locale")` locales_root (str | Path, optional): Folder where locales are located. Defaults to Path("locale").
Returns: Returns:
List[Any]: List of values in all locales List[Any]: List of values in all locales.
""" """
output: List[Any] = [] output: List[Any] = []
@@ -160,17 +161,20 @@ async def in_all_locales(key: str, *args: str, locales_root: str | Path = Path("
@asyncable @asyncable
def in_every_locale(key: str, *args: str, locales_root: str | Path = Path("locale")) -> Dict[str, Any]: def in_every_locale(
key: str, *args: str, locales_root: str | Path = Path("locale")
) -> Dict[str, Any]:
"""Get value of the provided key and path in every available locale with locale tag. """Get value of the provided key and path in every available locale with locale tag.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
locales_root (str | Path, optional): Folder where locales are located. Defaults to `Path("locale")` locales_root (str | Path, optional): Folder where locales are located. Defaults to Path("locale").
Returns: Returns:
Dict[str, Any]: Locale is a key, and it's value from locale file is a value Dict[str, Any]: Locale is a key, and it's value from locale file is a value.
""" """
output: Dict[str, Any] = {} output: Dict[str, Any] = {}
for locale in _get_valid_locales(locales_root): for locale in _get_valid_locales(locales_root):
@@ -199,12 +203,12 @@ async def in_every_locale(
"""Get value of the provided key and path in every available locale with locale tag. """Get value of the provided key and path in every available locale with locale tag.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
locales_root (str | Path, optional): Folder where locales are located. Defaults to `Path("locale")` locales_root (str | Path, optional): Folder where locales are located. Defaults to Path("locale").
Returns: Returns:
Dict[str, Any]: Locale is a key, and it's value from locale file is a value Dict[str, Any]: Locale is a key, and it's value from locale file is a value.
""" """
output: Dict[str, Any] = {} output: Dict[str, Any] = {}

View File

@@ -16,8 +16,8 @@ class BotLocale:
) -> None: ) -> None:
""" """
Args: Args:
default_locale (str | None): Default bot's locale. Defaults to `"en"` default_locale (str | None, optional): Default locale. Defaults to "en".
locales_root (str | Path): Folder where locales are located. Defaults to `Path("locale")` locales_root (str | Path, optional): Path to a directory with locale files. Defaults to Path("locale").
""" """
if isinstance(locales_root, str): if isinstance(locales_root, str):
locales_root = Path(locales_root) locales_root = Path(locales_root)
@@ -38,12 +38,12 @@ class BotLocale:
"""Get value of locale string. """Get value of locale string.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
locale (str | None, optional): Locale to be looked up in. Defaults to config's `"locale"` value locale (str | None, optional): Locale to looked up in. Defaults to config's `"locale"` value.
Returns: Returns:
Any: Value of provided locale key. Is usually `str`, `Dict[str, Any]` or `List[Any]` Any: Value of provided locale key. Is usually `str`, `Dict[str, Any]` or `List[Any]`.
""" """
if locale is None: if locale is None:
locale: str = self.default locale: str = self.default
@@ -72,11 +72,11 @@ class BotLocale:
"""Get value of the provided key and path in all available locales. """Get value of the provided key and path in all available locales.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
Returns: Returns:
List[Any]: List of values in all locales List[Any]: List of values in all locales.
""" """
output: List[Any] = [] output: List[Any] = []
@@ -102,11 +102,11 @@ class BotLocale:
"""Get value of the provided key and path in every available locale with locale tag. """Get value of the provided key and path in every available locale with locale tag.
Args: Args:
key (str): The last key of the locale's keys path key (str): The last key of the locale's keys path.
*args (str): Path to key like: `dict[args][key]` *args (str): Path to key like: `dict[args][key]`.
Returns: Returns:
Dict[str, Any]: Locale is a key, and it's value from locale file is a value Dict[str, Any]: Locale is a key, and it's value from locale file is a value.
""" """
output: Dict[str, Any] = {} output: Dict[str, Any] = {}

View File

@@ -19,7 +19,6 @@ logger: Logger = logging.getLogger(__name__)
class PycordBot(Bot): class PycordBot(Bot):
# TODO Write a docstring
@override @override
def __init__( def __init__(
self, self,
@@ -30,16 +29,6 @@ class PycordBot(Bot):
scheduler: AsyncIOScheduler | BackgroundScheduler | None = None, scheduler: AsyncIOScheduler | BackgroundScheduler | None = None,
**kwargs, **kwargs,
): ):
"""
Args:
*args:
config:
config_path:
locales_root:
scheduler:
**kwargs:
"""
self.config: Dict[str, Any] = config if config is not None else json_read(config_path) self.config: Dict[str, Any] = config if config is not None else json_read(config_path)
super().__init__( super().__init__(
@@ -62,30 +51,15 @@ class PycordBot(Bot):
self.scheduler: AsyncIOScheduler | BackgroundScheduler | None = scheduler self.scheduler: AsyncIOScheduler | BackgroundScheduler | None = scheduler
# TODO Write a docstring
@override @override
async def start(self, token: str, reconnect: bool = True, scheduler_start: bool = True) -> None: async def start(self, token: str, reconnect: bool = True, scheduler_start: bool = True) -> None:
"""
Args:
token:
reconnect:
scheduler_start:
"""
if self.scheduler is not None and scheduler_start: if self.scheduler is not None and scheduler_start:
self.scheduler.start() self.scheduler.start()
await super().start(token, reconnect=reconnect) await super().start(token, reconnect=reconnect)
# TODO Write a docstring
@override @override
async def close(self, scheduler_shutdown: bool = True, scheduler_wait: bool = True) -> None: async def close(self, scheduler_shutdown: bool = True, scheduler_wait: bool = True) -> None:
"""
Args:
scheduler_shutdown:
scheduler_wait:
"""
if self.scheduler is not None and scheduler_shutdown: if self.scheduler is not None and scheduler_shutdown:
self.scheduler.shutdown(scheduler_wait) self.scheduler.shutdown(scheduler_wait)

View File

@@ -16,24 +16,20 @@ def _hex_from_int(color_int: int) -> str:
def color_from_hex(hex_string: str) -> Colour: def color_from_hex(hex_string: str) -> Colour:
"""Convert valid hexadecimal string to :class:`discord.Colour`. """Convert valid hexadecimal string to discord.Colour.
Args: :param hex_string: Hexadecimal string to convert into Colour object
hex_string (str): Hexadecimal string to convert into :class:`discord.Colour` object :type hex_string: str
:return: Colour object
Returns:
Colour: :class:`discord.Colour` object
""" """
return Colour(_int_from_hex(hex_string)) return Colour(_int_from_hex(hex_string))
def hex_from_color(color: Colour) -> str: def hex_from_color(color: Colour) -> str:
"""Convert :class:`discord.Colour` to hexadecimal string. """Convert discord.Colour to hexadecimal string.
Args: :param color: Colour object to convert into the string
color (Colour): :class:`discord.Colour` object to convert into the string :type color: Colour
:return: Hexadecimal string in #XXXXXX format
Returns:
str: Hexadecimal string in #XXXXXX format
""" """
return _hex_from_int(color.value) return _hex_from_int(color.value)

View File

@@ -6,7 +6,7 @@ from logging import Logger
from os import cpu_count, getpid from os import cpu_count, getpid
from pathlib import Path from pathlib import Path
from time import time from time import time
from typing import Any, Dict, List, Optional from typing import Any, Dict, List
from typing_extensions import override from typing_extensions import override
@@ -46,7 +46,6 @@ logger: Logger = logging.getLogger(__name__)
class PyroClient(Client): class PyroClient(Client):
# TODO Write a docstring
@override @override
def __init__( def __init__(
self, self,
@@ -120,12 +119,6 @@ class PyroClient(Client):
@override @override
async def start(self, register_commands: bool = True, scheduler_start: bool = True) -> None: async def start(self, register_commands: bool = True, scheduler_start: bool = True) -> None:
"""Start the bot and it's services.
Args:
register_commands (bool, optional): Register commands on start. Defaults to `True`
scheduler_start (bool, optional): Start the scheduler on start. Defaults to `True`
"""
await super().start() await super().start()
self.start_time = time() self.start_time = time()
@@ -218,13 +211,6 @@ class PyroClient(Client):
async def stop( async def stop(
self, exit_completely: bool = True, scheduler_shutdown: bool = True, scheduler_wait: bool = True self, exit_completely: bool = True, scheduler_shutdown: bool = True, scheduler_wait: bool = True
) -> None: ) -> None:
"""Stop the bot and it's services.
Args:
exit_completely (bool, optional): Exit the program. Defaults to `True`
scheduler_shutdown (bool): Shutdown the scheduler. Defaults to `True`
scheduler_wait (bool): Wait for tasks to finish. Defaults to `True`
"""
try: try:
await self.send_message( await self.send_message(
chat_id=( chat_id=(
@@ -251,10 +237,10 @@ class PyroClient(Client):
raise SystemExit("Bot has been shut down, this is not an application error!") from exc raise SystemExit("Bot has been shut down, this is not an application error!") from exc
async def collect_commands(self) -> List[CommandSet] | None: async def collect_commands(self) -> List[CommandSet] | None:
"""Gather list of the bot's commands. """Gather list of the bot's commands
Returns: ### Returns:
List[CommandSet]: List of the commands' sets * `List[CommandSet]`: List of the commands' sets.
""" """
command_sets = None command_sets = None
@@ -336,10 +322,10 @@ class PyroClient(Client):
self, self,
command: str, command: str,
) -> None: ) -> None:
"""Add command to the bot's internal commands list. """Add command to the bot's internal commands list
Args: ### Args:
command (str): Command's name * command (`str`)
""" """
self.commands.append( self.commands.append(
PyroCommand( PyroCommand(
@@ -352,12 +338,9 @@ class PyroClient(Client):
command, command,
) )
async def register_commands(self, command_sets: Optional[List[CommandSet]] = None) -> None: async def register_commands(self, command_sets: List[CommandSet] | None = None) -> None:
"""Register commands stored in bot's 'commands' attribute. """Register commands stored in bot's 'commands' attribute"""
Args:
command_sets (List[CommandSet], optional): List of command sets. Commands will be parsed from bot's 'commands' attribute if not provided
"""
if command_sets is None: if command_sets is None:
commands = [ commands = [
BotCommand(command=command.command, description=command.description) BotCommand(command=command.command, description=command.description)
@@ -382,12 +365,9 @@ class PyroClient(Client):
language_code=command_set.language_code, language_code=command_set.language_code,
) )
async def remove_commands(self, command_sets: Optional[List[CommandSet]] = None) -> None: async def remove_commands(self, command_sets: List[CommandSet] | None = None) -> None:
"""Remove commands stored in bot's 'commands' attribute. """Remove commands stored in bot's 'commands' attribute"""
Args:
command_sets (List[CommandSet], optional): List of command sets. Commands with scope :class:`pyrogram.types.BotCommandScopeDefault` will be removed if not provided
"""
if command_sets is None: if command_sets is None:
logger.info("Removing commands with a default scope 'BotCommandScopeDefault'") logger.info("Removing commands with a default scope 'BotCommandScopeDefault'")
await self.delete_bot_commands(BotCommandScopeDefault()) await self.delete_bot_commands(BotCommandScopeDefault())