From ea88739f4f3b48a019a1af6ea9c24d6252c133d2 Mon Sep 17 00:00:00 2001 From: JuniorJPDJ Date: Sun, 18 Aug 2024 13:57:35 +0200 Subject: [PATCH 1/4] feat(ci,Dockerfile): add caching of build directories, add renovate.json, pin dockerfile OS packages --- .github/workflows/docker-publish.yml | 62 +++++++++++++++++++++++----- .gitignore | 1 + Dockerfile | 28 +++++++++---- docker-compose.yml | 13 +++--- renovate.json | 31 ++++++++++++++ requirements.txt | 2 +- 6 files changed, 110 insertions(+), 27 deletions(-) create mode 100644 renovate.json diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml index f1f0b607..1843e06a 100644 --- a/.github/workflows/docker-publish.yml +++ b/.github/workflows/docker-publish.yml @@ -1,8 +1,6 @@ name: Docker build on: - schedule: - - cron: '25 15 * * *' push: branches: - master @@ -24,22 +22,22 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 # Workaround: https://github.com/docker/build-push-action/issues/461 - name: Setup Docker buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@988b5a0280414f521da01fcc63a27aeeb4b104db # v3.6.1 - name: Log into registry ${{ env.REGISTRY }} - uses: docker/login-action@v2 + uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3.3.0 with: registry: ${{ env.REGISTRY }} username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - + - name: Extract Docker metadata id: meta - uses: docker/metadata-action@v4 + uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5.5.1 with: images: ${{ env.REGISTRY }}/${{ github.repository }} tags: | @@ -48,15 +46,59 @@ jobs: type=ref,event=tag type=raw,value=latest,enable={{is_default_branch}} + - name: Setup buildx mount cache + uses: actions/cache@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9 # v4.0.2 + with: + path: | + home-cache-386 + home-cache-amd64 + home-cache-armv6 + home-cache-armv7 + home-cache-arm64 + home-cargo-386 + home-cargo-amd64 + home-cargo-armv6 + home-cargo-armv7 + home-cargo-arm64 + key: buildx-mount-cache-${{ github.sha }} + restore-keys: | + buildx-mount-cache- + + - name: Inject buildx mount cache into docker + uses: reproducible-containers/buildkit-cache-dance@5b6db76d1da5c8b307d5d2e0706d266521b710de # v3.1.2 + with: + cache-map: | + { + "home-cache-386": { + "target": "/root/.cache", + "id": "home-cache-linux/386" + }, + "home-cache-amd64": { + "target": "/root/.cache", + "id": "home-cache-linux/amd64" + }, + "home-cache-armv6": { + "target": "/root/.cache", + "id": "home-cache-linux/arm/v6" + }, + "home-cache-armv7": { + "target": "/root/.cache", + "id": "home-cache-linux/arm/v7" + }, + "home-cache-arm64": { + "target": "/root/.cache", + "id": "home-cache-linux/arm64" + } + } + - name: Build and push Docker image id: build-and-push - uses: docker/build-push-action@v4 + uses: docker/build-push-action@5cd11c3a4ced054e52742c5fd54dca954e0edd85 # v6.7.0 with: context: . push: true - platforms: linux/amd64,linux/arm64 + platforms: linux/amd64,linux/386,linux/arm/v6,linux/arm/v7,linux/arm64 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=gha cache-to: type=gha,mode=max - diff --git a/.gitignore b/.gitignore index 7da5e553..97214f1e 100644 --- a/.gitignore +++ b/.gitignore @@ -74,6 +74,7 @@ chart/charts # Database file uno.sqlite3 +data/ images/api_auth.json images/sticker_config.json diff --git a/Dockerfile b/Dockerfile index 7ed8e877..f1439696 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,17 +1,27 @@ FROM python:3.11-alpine -RUN apk add --no-cache gettext +# renovate: datasource=repology depName=alpine_3_20/gettext versioning=loose +ARG GETTEXT_VERSION="0.22.5-r0" -WORKDIR /app/ -COPY requirements.txt . -RUN pip install -r requirements.txt +WORKDIR /app -COPY . . +ADD requirements.txt . -RUN cd locales && find . -maxdepth 2 -type d -name 'LC_MESSAGES' -exec ash -c 'msgfmt {}/unobot.po -o {}/unobot.mo' \; +RUN --mount=type=cache,sharing=locked,target=/root/.cache,id=home-cache-$TARGETPLATFORM \ + apk add --no-cache \ + gettext=${GETTEXT_VERSION} \ + && \ + pip install -r requirements.txt && \ + chown -R nobody:nogroup /app +COPY --chown=nobody:nogroup . . -VOLUME /app/data -ENV UNO_DB /app/data/uno.sqlite3 +USER nobody -ENTRYPOINT python3 ./bot.py +RUN cd locales && \ + find . -maxdepth 2 -type d -name 'LC_MESSAGES' -exec ash -c 'msgfmt {}/unobot.po -o {}/unobot.mo' \; + +VOLUME /app/data +ENV UNO_DB=/app/data/uno.sqlite3 + +ENTRYPOINT [ "python", "bot.py" ] diff --git a/docker-compose.yml b/docker-compose.yml index 6a369860..61d138ed 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,7 @@ -version: "3.9" services: - unobot: - container_name: unobot - build: - context: . - dockerfile: Dockerfile - restart: unless-stopped \ No newline at end of file + maumaubot: + # build: . + image: ghcr.io/jh0ker/mau_mau_bot + restart: unless-stopped + volumes: + - ./data:/app/data \ No newline at end of file diff --git a/renovate.json b/renovate.json new file mode 100644 index 00000000..bc978c73 --- /dev/null +++ b/renovate.json @@ -0,0 +1,31 @@ +{ + "$schema": "https://docs.renovatebot.com/renovate-schema.json", + "extends": [ + "config:best-practices", + ":semanticCommits", + ":semanticCommitScopeDisabled", + "docker:enableMajor", + "customManagers:dockerfileVersions", + ":disableRateLimiting", + ":ignoreUnstable", + ":separateMultipleMajorReleases", + ":updateNotScheduled" + ], + "packageRules": [ + { + "description": "Group OS packages to avoid build errors if more than one package is updated and previous version is not present in repo already", + "matchDatasources": [ + "repology" + ], + "groupName": "OS Packages" + } + ], + "ignoreDeps": [ + "ghcr.io/jh0ker/mau_mau_bot", + "ghcr.io/juniorjpdj/mau_mau_bot" + ], + "baseBranches": [ + "master" + ], + "forkProcessing": "enabled" +} diff --git a/requirements.txt b/requirements.txt index 65daeb28..a583500a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ python-telegram-bot==13.15 -pony +pony==0.7.17 From e2efe0894d5d63a8cc67e9c59065c544977f9dc1 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 18 Aug 2024 12:14:01 +0000 Subject: [PATCH 2/4] chore: update dependency python-telegram-bot to v13.15 --- Pipfile | 2 +- Pipfile.lock | 141 ++++++++++++++++++++++++++------------------------- 2 files changed, 74 insertions(+), 69 deletions(-) diff --git a/Pipfile b/Pipfile index b65b22b8..8f95a1d8 100644 --- a/Pipfile +++ b/Pipfile @@ -7,7 +7,7 @@ verify_ssl = true telethon = "*" [packages] -python-telegram-bot = "==13.11" +python-telegram-bot = "==13.15" pony = "*" [requires] diff --git a/Pipfile.lock b/Pipfile.lock index 0ccfa719..9aaf4cbc 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "87f82f4abefdefd3b212fa99f5cbf6e222d6855aa7574d7a94fbf51b33cc342f" + "sha256": "73800b33b596a4e3296366e3cf666d53891c846422e8d7a91ec3470130b852f1" }, "pipfile-spec": 6, "requires": { @@ -33,50 +33,43 @@ }, "certifi": { "hashes": [ - "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3", - "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18" + "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", + "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" ], "markers": "python_version >= '3.6'", - "version": "==2022.12.7" + "version": "==2024.7.4" }, "pony": { "hashes": [ - "sha256:5f45fc67587f4520c560a57148cc573b097d42f82f5cb200d72c957b5708198d", - "sha256:608a1c1d662983bad2590e650f2bbc1cd6ed48558894ad8f50da4739ff98f614" + "sha256:b72172d57abd5e0846cd8d71231572da20f526327bf0d33348a9276f624d8aa7", + "sha256:c37e9b44f975d147b79cf56925b16b0e40b2b47ba5958d0c01579f37a5a24f7c" ], "index": "pypi", - "version": "==0.7.16" + "version": "==0.7.17" }, "python-telegram-bot": { "hashes": [ - "sha256:534f5bb0ff4ca34c9252e97e0b3bcdab81d97be0eb4821682a361cb426c00e55", - "sha256:baeff704baa2ac3dc17a944c02da888228ad258e89be2e5bcbd13a8a5102d573" + "sha256:06780c258d3f2a3c6c79a7aeb45714f4cd1dd6275941b7dc4628bba64fddd465", + "sha256:b4047606b8081b62bbd6aa361f7ca1efe87fa8f1881ec9d932d35844bf57a154" ], "index": "pypi", - "version": "==13.11" + "markers": "python_version >= '3.7'", + "version": "==13.15" }, "pytz": { "hashes": [ - "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588", - "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb" - ], - "version": "==2023.3" - }, - "pytz-deprecation-shim": { - "hashes": [ - "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6", - "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d" + "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", + "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==0.1.0.post0" + "version": "==2024.1" }, "setuptools": { "hashes": [ - "sha256:257de92a9d50a60b8e22abfcbb771571fde0dbf3ec234463212027a4eeecbe9a", - "sha256:e728ca814a823bf7bf60162daf9db95b93d532948c4c0bea762ce62f60189078" + "sha256:80aacbf633704e9c8bfa1d99fa5dd4dc59573efcf9e4042c13d3bcef91ac2ef9", + "sha256:f11dd94b7bae3a156a95ec151f24e4637fb4fa19c878e4d191bfb8b2d82728c4" ], - "markers": "python_version >= '3.7'", - "version": "==67.6.1" + "markers": "python_version >= '3.8'", + "version": "==72.2.0" }, "six": { "hashes": [ @@ -88,36 +81,58 @@ }, "tornado": { "hashes": [ - "sha256:1d54d13ab8414ed44de07efecb97d4ef7c39f7438cf5e976ccd356bebb1b5fca", - "sha256:20f638fd8cc85f3cbae3c732326e96addff0a15e22d80f049e00121651e82e72", - "sha256:5c87076709343557ef8032934ce5f637dbb552efa7b21d08e89ae7619ed0eb23", - "sha256:5f8c52d219d4995388119af7ccaa0bcec289535747620116a58d830e7c25d8a8", - "sha256:6fdfabffd8dfcb6cf887428849d30cf19a3ea34c2c248461e1f7d718ad30b66b", - "sha256:87dcafae3e884462f90c90ecc200defe5e580a7fbbb4365eda7c7c1eb809ebc9", - "sha256:9b630419bde84ec666bfd7ea0a4cb2a8a651c2d5cccdbdd1972a0c859dfc3c13", - "sha256:b8150f721c101abdef99073bf66d3903e292d851bee51910839831caba341a75", - "sha256:ba09ef14ca9893954244fd872798b4ccb2367c165946ce2dd7376aebdde8e3ac", - "sha256:d3a2f5999215a3a06a4fc218026cd84c61b8b2b40ac5296a6db1f1451ef04c1e", - "sha256:e5f923aa6a47e133d1cf87d60700889d7eae68988704e20c75fb2d65677a8e4b" - ], - "markers": "python_version >= '3.7'", - "version": "==6.2" - }, - "tzdata": { - "hashes": [ - "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a", - "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda" - ], - "markers": "platform_system == 'Windows'", - "version": "==2023.3" + "sha256:0a00ff4561e2929a2c37ce706cb8233b7907e0cdc22eab98888aca5dd3775feb", + "sha256:0d321a39c36e5f2c4ff12b4ed58d41390460f798422c4504e09eb5678e09998c", + "sha256:1e8225a1070cd8eec59a996c43229fe8f95689cb16e552d130b9793cb570a288", + "sha256:20241b3cb4f425e971cb0a8e4ffc9b0a861530ae3c52f2b0434e6c1b57e9fd95", + "sha256:25ad220258349a12ae87ede08a7b04aca51237721f63b1808d39bdb4b2164558", + "sha256:33892118b165401f291070100d6d09359ca74addda679b60390b09f8ef325ffe", + "sha256:33c6e81d7bd55b468d2e793517c909b139960b6c790a60b7991b9b6b76fb9791", + "sha256:3447475585bae2e77ecb832fc0300c3695516a47d46cefa0528181a34c5b9d3d", + "sha256:34ca2dac9e4d7afb0bed4677512e36a52f09caa6fded70b4e3e1c89dbd92c326", + "sha256:3e63498f680547ed24d2c71e6497f24bca791aca2fe116dbc2bd0ac7f191691b", + "sha256:548430be2740e327b3fe0201abe471f314741efcb0067ec4f2d7dcfb4825f3e4", + "sha256:6196a5c39286cc37c024cd78834fb9345e464525d8991c21e908cc046d1cc02c", + "sha256:61b32d06ae8a036a6607805e6720ef00a3c98207038444ba7fd3d169cd998910", + "sha256:6286efab1ed6e74b7028327365cf7346b1d777d63ab30e21a0f4d5b275fc17d5", + "sha256:65d98939f1a2e74b58839f8c4dab3b6b3c1ce84972ae712be02845e65391ac7c", + "sha256:66324e4e1beede9ac79e60f88de548da58b1f8ab4b2f1354d8375774f997e6c0", + "sha256:6c77c9937962577a6a76917845d06af6ab9197702a42e1346d8ae2e76b5e3675", + "sha256:70dec29e8ac485dbf57481baee40781c63e381bebea080991893cd297742b8fd", + "sha256:7250a3fa399f08ec9cb3f7b1b987955d17e044f1ade821b32e5f435130250d7f", + "sha256:748290bf9112b581c525e6e6d3820621ff020ed95af6f17fedef416b27ed564c", + "sha256:7da13da6f985aab7f6f28debab00c67ff9cbacd588e8477034c0652ac141feea", + "sha256:8f959b26f2634a091bb42241c3ed8d3cedb506e7c27b8dd5c7b9f745318ddbb6", + "sha256:9de9e5188a782be6b1ce866e8a51bc76a0fbaa0e16613823fc38e4fc2556ad05", + "sha256:a48900ecea1cbb71b8c71c620dee15b62f85f7c14189bdeee54966fbd9a0c5bd", + "sha256:b87936fd2c317b6ee08a5741ea06b9d11a6074ef4cc42e031bc6403f82a32575", + "sha256:c77da1263aa361938476f04c4b6c8916001b90b2c2fdd92d8d535e1af48fba5a", + "sha256:cb5ec8eead331e3bb4ce8066cf06d2dfef1bfb1b2a73082dfe8a161301b76e37", + "sha256:cc0ee35043162abbf717b7df924597ade8e5395e7b66d18270116f8745ceb795", + "sha256:d14d30e7f46a0476efb0deb5b61343b1526f73ebb5ed84f23dc794bdb88f9d9f", + "sha256:d371e811d6b156d82aa5f9a4e08b58debf97c302a35714f6f45e35139c332e32", + "sha256:d3d20ea5782ba63ed13bc2b8c291a053c8d807a8fa927d941bd718468f7b950c", + "sha256:d3f7594930c423fd9f5d1a76bee85a2c36fd8b4b16921cae7e965f22575e9c01", + "sha256:dcef026f608f678c118779cd6591c8af6e9b4155c44e0d1bc0c87c036fb8c8c4", + "sha256:e0791ac58d91ac58f694d8d2957884df8e4e2f6687cdf367ef7eb7497f79eaa2", + "sha256:e385b637ac3acaae8022e7e47dfa7b83d3620e432e3ecb9a3f7f58f150e50921", + "sha256:e519d64089b0876c7b467274468709dadf11e41d65f63bba207e04217f47c085", + "sha256:e7229e60ac41a1202444497ddde70a48d33909e484f96eb0da9baf8dc68541df", + "sha256:ed3ad863b1b40cd1d4bd21e7498329ccaece75db5a5bf58cd3c9f130843e7102", + "sha256:f0ba29bafd8e7e22920567ce0d232c26d4d47c8b5cf4ed7b562b5db39fa199c5", + "sha256:fa2ba70284fa42c2a5ecb35e322e68823288a4251f9ba9cc77be04ae15eada68", + "sha256:fba85b6cd9c39be262fcd23865652920832b61583de2a2ca907dbd8e8a8c81e5" + ], + "markers": "python_version >= '3.5'", + "version": "==6.1" }, "tzlocal": { "hashes": [ - "sha256:3f21d09e1b2aa9f2dacca12da240ca37de3ba5237a93addfd6d593afe9073355", - "sha256:b44c4388f3d34f25862cfbb387578a4d70fec417649da694a132f628a23367e2" + "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8", + "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e" ], - "markers": "python_version >= '3.7'", - "version": "==4.3" + "markers": "python_version >= '3.8'", + "version": "==5.2" } }, "develop": { @@ -129,21 +144,11 @@ }, "pyasn1": { "hashes": [ - "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", - "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", - "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", - "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", - "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", - "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", - "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", - "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", - "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", - "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", - "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", - "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", - "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" + "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" ], - "version": "==0.4.8" + "markers": "python_version >= '3.8'", + "version": "==0.6.0" }, "rsa": { "hashes": [ @@ -155,11 +160,11 @@ }, "telethon": { "hashes": [ - "sha256:613bae42acb5f2eeb1a0b92614e323021c66f374db62adf9826ea0c2c9120bb1", - "sha256:893c10f133974fba4c53eb1736b6514d596d1cd94c83436a711f3345df945199" + "sha256:11db5c7ed7e37f1272d443fb7eea0f1db580d56c6949165233946fb323aaf3a7" ], "index": "pypi", - "version": "==1.28.2" + "markers": "python_version >= '3.5'", + "version": "==1.36.0" } } } From 1732b43c362827cf45b875fa64e510ef58d0d2f2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 18 Aug 2024 12:13:16 +0000 Subject: [PATCH 3/4] chore: pin python docker tag to 700b4aa --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index f1439696..300c57ff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-alpine +FROM python:3.11-alpine@sha256:700b4aa84090748aafb348fc042b5970abb0a73c8f1b4fcfe0f4e3c2a4a9fcca # renovate: datasource=repology depName=alpine_3_20/gettext versioning=loose ARG GETTEXT_VERSION="0.22.5-r0" From bbbc4dfede96ddb625a9bbcae570a415466301c2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Sun, 18 Aug 2024 12:14:20 +0000 Subject: [PATCH 4/4] chore: update helm release common to v3.3.2 --- chart/Chart.lock | 6 +++--- chart/Chart.yaml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/chart/Chart.lock b/chart/Chart.lock index f426470b..7942c990 100644 --- a/chart/Chart.lock +++ b/chart/Chart.lock @@ -1,6 +1,6 @@ dependencies: - name: common repository: https://bjw-s.github.io/helm-charts - version: 3.0.0-beta4 -digest: sha256:7b1303fd68b34ce69f2b6eb8a72a1e74f77636f906f2c1499234fc8f32aa4aac -generated: "2024-03-11T03:47:29.800675883+01:00" + version: 3.3.2 +digest: sha256:5a0f9f06aa383b7cc3070899b879401bcd4ae48b021d0a2b7f9ba39827019e24 +generated: "2024-08-18T12:14:16.193707111Z" diff --git a/chart/Chart.yaml b/chart/Chart.yaml index 98a5b418..7b5db7e6 100644 --- a/chart/Chart.yaml +++ b/chart/Chart.yaml @@ -12,7 +12,7 @@ keywords: dependencies: - name: common repository: https://bjw-s.github.io/helm-charts - version: 3.0.0-beta4 + version: 3.3.2 sources: - https://github.com/jh0ker/mau_mau_bot annotations: