From abfa3f20047fb2bd3226bb4100a729b75c35f528 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 16:52:23 +0300 Subject: [PATCH 01/53] add workflow check.yml --- .github/workflows/.github/workflows/check.yml | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/.github/workflows/check.yml diff --git a/.github/workflows/.github/workflows/check.yml b/.github/workflows/.github/workflows/check.yml new file mode 100644 index 0000000..85ad306 --- /dev/null +++ b/.github/workflows/.github/workflows/check.yml @@ -0,0 +1,24 @@ +name: Minecraft monitor +on: + schedule: + - cron: '*/5 * * * *' + workflow_dispatch: {} + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Install deps + run: pip install mcstatus requests + - name: Run checker + env: + TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} + TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} + run: python check.py From 49a3852e254f66841272376f7c8464c7d16d29a9 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 16:54:41 +0300 Subject: [PATCH 02/53] add check.py --- .github/workflows/.github/workflows/check.py | 38 ++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/workflows/.github/workflows/check.py diff --git a/.github/workflows/.github/workflows/check.py b/.github/workflows/.github/workflows/check.py new file mode 100644 index 0000000..229bc3e --- /dev/null +++ b/.github/workflows/.github/workflows/check.py @@ -0,0 +1,38 @@ +import os, json, requests +from mcstatus import JavaServer + +SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") +BOT = os.environ["TELEGRAM_BOT_TOKEN"] +CHAT = os.environ["TELEGRAM_CHAT_ID"] + +def send(text): + requests.post(f"https://api.telegram.org/bot{BOT}/sendMessage", data={"chat_id": CHAT, "text": text}) + +def read_last(): + try: + with open("last_players.txt","r",encoding="utf-8") as f: + return set(json.loads(f.read() or "[]")) + except: + return set() + +def write_last(s): + with open("last_players.txt","w",encoding="utf-8") as f: + f.write(json.dumps(list(s), ensure_ascii=False)) + +last = read_last() +try: + status = SERVER.query() + current = set(status.players.names or []) +except Exception: + current = set() + +joined = current - last +left = last - current + +for p in joined: + send(f"👤 Игрок {p} зашёл на сервер.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") +for p in left: + send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") + +if joined or left: + write_last(current) From 75e3d7c2fefca51e9f8bd849dc0095bc311fd5b4 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:03:14 +0300 Subject: [PATCH 03/53] add workflow check.yml add workflow check.yml --- .github/.github/workflows/check.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/.github/workflows/check.yml diff --git a/.github/.github/workflows/check.yml b/.github/.github/workflows/check.yml new file mode 100644 index 0000000..85ad306 --- /dev/null +++ b/.github/.github/workflows/check.yml @@ -0,0 +1,24 @@ +name: Minecraft monitor +on: + schedule: + - cron: '*/5 * * * *' + workflow_dispatch: {} + +jobs: + check: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + persist-credentials: false + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: '3.10' + - name: Install deps + run: pip install mcstatus requests + - name: Run checker + env: + TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} + TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} + run: python check.py From 222c313c8fa8198d7e9c70ea96c0928ae39a2c8f Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:05:31 +0300 Subject: [PATCH 04/53] add check.py --- .github/.github/workflows/check.py | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 .github/.github/workflows/check.py diff --git a/.github/.github/workflows/check.py b/.github/.github/workflows/check.py new file mode 100644 index 0000000..229bc3e --- /dev/null +++ b/.github/.github/workflows/check.py @@ -0,0 +1,38 @@ +import os, json, requests +from mcstatus import JavaServer + +SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") +BOT = os.environ["TELEGRAM_BOT_TOKEN"] +CHAT = os.environ["TELEGRAM_CHAT_ID"] + +def send(text): + requests.post(f"https://api.telegram.org/bot{BOT}/sendMessage", data={"chat_id": CHAT, "text": text}) + +def read_last(): + try: + with open("last_players.txt","r",encoding="utf-8") as f: + return set(json.loads(f.read() or "[]")) + except: + return set() + +def write_last(s): + with open("last_players.txt","w",encoding="utf-8") as f: + f.write(json.dumps(list(s), ensure_ascii=False)) + +last = read_last() +try: + status = SERVER.query() + current = set(status.players.names or []) +except Exception: + current = set() + +joined = current - last +left = last - current + +for p in joined: + send(f"👤 Игрок {p} зашёл на сервер.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") +for p in left: + send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") + +if joined or left: + write_last(current) From 6e052224d29b3fb92d8304da6073469bd72491e8 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:06:38 +0300 Subject: [PATCH 05/53] add last_players.txt --- .github/.github/last_players.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/.github/last_players.txt diff --git a/.github/.github/last_players.txt b/.github/.github/last_players.txt new file mode 100644 index 0000000..fe51488 --- /dev/null +++ b/.github/.github/last_players.txt @@ -0,0 +1 @@ +[] From 47340f5cc7d35b85957fba858445b7d94fc2dcb7 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:16:38 +0300 Subject: [PATCH 06/53] Rename .github/workflows/.github/workflows/check.yml to .github/workflows/check.yml --- .github/workflows/{.github/workflows => }/check.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{.github/workflows => }/check.yml (100%) diff --git a/.github/workflows/.github/workflows/check.yml b/.github/workflows/check.yml similarity index 100% rename from .github/workflows/.github/workflows/check.yml rename to .github/workflows/check.yml From ee094d76395668147834155765ba2d04ecf149c8 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:18:16 +0300 Subject: [PATCH 07/53] Rename .github/workflows/.github/workflows/check.py to .github/workflows/check.py --- .github/workflows/{.github/workflows => }/check.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/workflows/{.github/workflows => }/check.py (100%) diff --git a/.github/workflows/.github/workflows/check.py b/.github/workflows/check.py similarity index 100% rename from .github/workflows/.github/workflows/check.py rename to .github/workflows/check.py From 38b6328f65f585503256c51155aea93c709da406 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:22:24 +0300 Subject: [PATCH 08/53] Rename last_players.txt to last_players.txt --- .github/{.github => workflows}/last_players.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{.github => workflows}/last_players.txt (100%) diff --git a/.github/.github/last_players.txt b/.github/workflows/last_players.txt similarity index 100% rename from .github/.github/last_players.txt rename to .github/workflows/last_players.txt From 6735c562608cf742f1be0524fc91d73804fd832d Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:36:45 +0300 Subject: [PATCH 09/53] Update check.yml From 82e7858291e9f9d595ae8355c2031239eeb57fc8 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:39:35 +0300 Subject: [PATCH 10/53] fix path to check.py --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 85ad306..89e8f6e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -21,4 +21,4 @@ jobs: env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} - run: python check.py + run: python path/to/check.py From 0e768af0c366c5cfbf552de35bbd11f0ddf3c98a Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:46:00 +0300 Subject: [PATCH 11/53] Update and rename .github/workflows/check.py to .github/check.py --- .github/{workflows => }/check.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{workflows => }/check.py (100%) diff --git a/.github/workflows/check.py b/.github/check.py similarity index 100% rename from .github/workflows/check.py rename to .github/check.py From 909e69d6d7c2a8159e5240b4d240feff9de07fa6 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:46:35 +0300 Subject: [PATCH 12/53] Rename .github/workflows/check.yml to .github/check.yml --- .github/{workflows => }/check.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{workflows => }/check.yml (100%) diff --git a/.github/workflows/check.yml b/.github/check.yml similarity index 100% rename from .github/workflows/check.yml rename to .github/check.yml From 5a260766b6c1e3a982b27ccded95d68803f09353 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:47:26 +0300 Subject: [PATCH 13/53] Rename .github/check.yml to .github/workflows/check.yml --- .github/{ => workflows}/check.yml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{ => workflows}/check.yml (100%) diff --git a/.github/check.yml b/.github/workflows/check.yml similarity index 100% rename from .github/check.yml rename to .github/workflows/check.yml From add0d7ae763369213a0d577be201f634b75abfe4 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:47:59 +0300 Subject: [PATCH 14/53] Rename .github/workflows/last_players.txt to .github/last_players.txt --- .github/{workflows => }/last_players.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{workflows => }/last_players.txt (100%) diff --git a/.github/workflows/last_players.txt b/.github/last_players.txt similarity index 100% rename from .github/workflows/last_players.txt rename to .github/last_players.txt From 28f289ccb8af048fb0bf04145733943fafb549d9 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:49:50 +0300 Subject: [PATCH 15/53] Delete .github/.github/workflows directory --- .github/.github/workflows/check.py | 38 ----------------------------- .github/.github/workflows/check.yml | 24 ------------------ 2 files changed, 62 deletions(-) delete mode 100644 .github/.github/workflows/check.py delete mode 100644 .github/.github/workflows/check.yml diff --git a/.github/.github/workflows/check.py b/.github/.github/workflows/check.py deleted file mode 100644 index 229bc3e..0000000 --- a/.github/.github/workflows/check.py +++ /dev/null @@ -1,38 +0,0 @@ -import os, json, requests -from mcstatus import JavaServer - -SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") -BOT = os.environ["TELEGRAM_BOT_TOKEN"] -CHAT = os.environ["TELEGRAM_CHAT_ID"] - -def send(text): - requests.post(f"https://api.telegram.org/bot{BOT}/sendMessage", data={"chat_id": CHAT, "text": text}) - -def read_last(): - try: - with open("last_players.txt","r",encoding="utf-8") as f: - return set(json.loads(f.read() or "[]")) - except: - return set() - -def write_last(s): - with open("last_players.txt","w",encoding="utf-8") as f: - f.write(json.dumps(list(s), ensure_ascii=False)) - -last = read_last() -try: - status = SERVER.query() - current = set(status.players.names or []) -except Exception: - current = set() - -joined = current - last -left = last - current - -for p in joined: - send(f"👤 Игрок {p} зашёл на сервер.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") -for p in left: - send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") - -if joined or left: - write_last(current) diff --git a/.github/.github/workflows/check.yml b/.github/.github/workflows/check.yml deleted file mode 100644 index 85ad306..0000000 --- a/.github/.github/workflows/check.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Minecraft monitor -on: - schedule: - - cron: '*/5 * * * *' - workflow_dispatch: {} - -jobs: - check: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: '3.10' - - name: Install deps - run: pip install mcstatus requests - - name: Run checker - env: - TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} - TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} - run: python check.py From 20ea7a4607e4c1104e121ab9a76846408d2f0df8 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:53:06 +0300 Subject: [PATCH 16/53] Update check.yml --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 89e8f6e..85ad306 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -21,4 +21,4 @@ jobs: env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} - run: python path/to/check.py + run: python check.py From 511d36ffc87a55e7fdd3973b1e00aa179e48e0fb Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:57:31 +0300 Subject: [PATCH 17/53] Update check.yml From 20fd54404280f14b96ee5460fcceda2e5d18bac4 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 17:58:38 +0300 Subject: [PATCH 18/53] Update check.py From a17e86f5a131cfebdf31a339937c0f2cf56c0a54 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:06:47 +0300 Subject: [PATCH 19/53] Create check.py --- scripts/check.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 scripts/check.py diff --git a/scripts/check.py b/scripts/check.py new file mode 100644 index 0000000..229bc3e --- /dev/null +++ b/scripts/check.py @@ -0,0 +1,38 @@ +import os, json, requests +from mcstatus import JavaServer + +SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") +BOT = os.environ["TELEGRAM_BOT_TOKEN"] +CHAT = os.environ["TELEGRAM_CHAT_ID"] + +def send(text): + requests.post(f"https://api.telegram.org/bot{BOT}/sendMessage", data={"chat_id": CHAT, "text": text}) + +def read_last(): + try: + with open("last_players.txt","r",encoding="utf-8") as f: + return set(json.loads(f.read() or "[]")) + except: + return set() + +def write_last(s): + with open("last_players.txt","w",encoding="utf-8") as f: + f.write(json.dumps(list(s), ensure_ascii=False)) + +last = read_last() +try: + status = SERVER.query() + current = set(status.players.names or []) +except Exception: + current = set() + +joined = current - last +left = last - current + +for p in joined: + send(f"👤 Игрок {p} зашёл на сервер.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") +for p in left: + send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") + +if joined or left: + write_last(current) From f62332cc87f18b03504a5e103b742e2c7328789f Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:08:49 +0300 Subject: [PATCH 20/53] Update check.yml --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 85ad306..729dcd9 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -21,4 +21,4 @@ jobs: env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} - run: python check.py + run: python scripts/check.py From 8064fc66b8f7d7cb72dbd12cf570bf8a2920a5e9 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:24:33 +0300 Subject: [PATCH 21/53] Delete .github/check.py --- .github/check.py | 38 -------------------------------------- 1 file changed, 38 deletions(-) delete mode 100644 .github/check.py diff --git a/.github/check.py b/.github/check.py deleted file mode 100644 index 229bc3e..0000000 --- a/.github/check.py +++ /dev/null @@ -1,38 +0,0 @@ -import os, json, requests -from mcstatus import JavaServer - -SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") -BOT = os.environ["TELEGRAM_BOT_TOKEN"] -CHAT = os.environ["TELEGRAM_CHAT_ID"] - -def send(text): - requests.post(f"https://api.telegram.org/bot{BOT}/sendMessage", data={"chat_id": CHAT, "text": text}) - -def read_last(): - try: - with open("last_players.txt","r",encoding="utf-8") as f: - return set(json.loads(f.read() or "[]")) - except: - return set() - -def write_last(s): - with open("last_players.txt","w",encoding="utf-8") as f: - f.write(json.dumps(list(s), ensure_ascii=False)) - -last = read_last() -try: - status = SERVER.query() - current = set(status.players.names or []) -except Exception: - current = set() - -joined = current - last -left = last - current - -for p in joined: - send(f"👤 Игрок {p} зашёл на сервер.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") -for p in left: - send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") - -if joined or left: - write_last(current) From 475e926215dc0a10fb562c141caec75973b6433f Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:25:45 +0300 Subject: [PATCH 22/53] Rename .github/last_players.txt to .github/scripts/last_players.txt --- .github/{ => scripts}/last_players.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/{ => scripts}/last_players.txt (100%) diff --git a/.github/last_players.txt b/.github/scripts/last_players.txt similarity index 100% rename from .github/last_players.txt rename to .github/scripts/last_players.txt From 9f717678e95a005c9a2eca714721699d4b82328c Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:26:35 +0300 Subject: [PATCH 23/53] Create last_players.txt --- scripts/last_players.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 scripts/last_players.txt diff --git a/scripts/last_players.txt b/scripts/last_players.txt new file mode 100644 index 0000000..8028527 --- /dev/null +++ b/scripts/last_players.txt @@ -0,0 +1 @@ +[] From bbb32d0787efba751816d28975084d83ccba03a1 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:27:16 +0300 Subject: [PATCH 24/53] Delete .github/scripts directory --- .github/scripts/last_players.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/scripts/last_players.txt diff --git a/.github/scripts/last_players.txt b/.github/scripts/last_players.txt deleted file mode 100644 index fe51488..0000000 --- a/.github/scripts/last_players.txt +++ /dev/null @@ -1 +0,0 @@ -[] From 8a4b8003770db688f76bf79a181cb99bd8bacda8 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:31:53 +0300 Subject: [PATCH 25/53] Update check.py --- scripts/check.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 229bc3e..12c4b5a 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,25 +1,36 @@ import os, json, requests from mcstatus import JavaServer +# Адрес твоего сервера Minecraft SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") + +# Переменные окружения из GitHub Secrets BOT = os.environ["TELEGRAM_BOT_TOKEN"] CHAT = os.environ["TELEGRAM_CHAT_ID"] -def send(text): - requests.post(f"https://api.telegram.org/bot{BOT}/sendMessage", data={"chat_id": CHAT, "text": text}) +def send(text: str): + """Отправка сообщения в Telegram""" + requests.post( + f"https://api.telegram.org/bot{BOT}/sendMessage", + data={"chat_id": CHAT, "text": text} + ) def read_last(): + """Чтение списка игроков из last_players.txt""" try: - with open("last_players.txt","r",encoding="utf-8") as f: + with open("scripts/last_players.txt", "r", encoding="utf-8") as f: return set(json.loads(f.read() or "[]")) - except: + except Exception: return set() -def write_last(s): - with open("last_players.txt","w",encoding="utf-8") as f: - f.write(json.dumps(list(s), ensure_ascii=False)) +def write_last(players: set): + """Запись списка игроков в last_players.txt""" + with open("scripts/last_players.txt", "w", encoding="utf-8") as f: + f.write(json.dumps(list(players), ensure_ascii=False)) +# --- Основная логика --- last = read_last() + try: status = SERVER.query() current = set(status.players.names or []) @@ -31,6 +42,7 @@ def write_last(s): for p in joined: send(f"👤 Игрок {p} зашёл на сервер.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") + for p in left: send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") From 3e330e22f2232a5b2403e1d0bd0bdf7bd81bd8a7 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:34:58 +0300 Subject: [PATCH 26/53] Update last_players.txt --- scripts/last_players.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/last_players.txt b/scripts/last_players.txt index 8028527..8b13789 100644 --- a/scripts/last_players.txt +++ b/scripts/last_players.txt @@ -1 +1 @@ -[] + From df466f7a228f7900a6bf9e0851e014a848aa76e2 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:35:44 +0300 Subject: [PATCH 27/53] Update check.py --- scripts/check.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/check.py b/scripts/check.py index 12c4b5a..0fd403e 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -48,3 +48,6 @@ def write_last(players: set): if joined or left: write_last(current) +if not last and current: + send(f"📊 Первый запуск: сейчас {len(current)} игроков: {', '.join(current)}") + write_last(current) From 530a27304235b04670787e6071908c977f0c928d Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:39:50 +0300 Subject: [PATCH 28/53] Update check.py --- scripts/check.py | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 0fd403e..8947b92 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,22 +1,17 @@ import os, json, requests from mcstatus import JavaServer -# Адрес твоего сервера Minecraft SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") - -# Переменные окружения из GitHub Secrets BOT = os.environ["TELEGRAM_BOT_TOKEN"] CHAT = os.environ["TELEGRAM_CHAT_ID"] def send(text: str): - """Отправка сообщения в Telegram""" requests.post( f"https://api.telegram.org/bot{BOT}/sendMessage", data={"chat_id": CHAT, "text": text} ) def read_last(): - """Чтение списка игроков из last_players.txt""" try: with open("scripts/last_players.txt", "r", encoding="utf-8") as f: return set(json.loads(f.read() or "[]")) @@ -24,11 +19,9 @@ def read_last(): return set() def write_last(players: set): - """Запись списка игроков в last_players.txt""" with open("scripts/last_players.txt", "w", encoding="utf-8") as f: f.write(json.dumps(list(players), ensure_ascii=False)) -# --- Основная логика --- last = read_last() try: @@ -46,8 +39,5 @@ def write_last(players: set): for p in left: send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") -if joined or left: - write_last(current) -if not last and current: - send(f"📊 Первый запуск: сейчас {len(current)} игроков: {', '.join(current)}") - write_last(current) +# Записываем текущее состояние ВСЕГДА +write_last(current) From 8af50624bea08ede8c4663fdc576c11642c55341 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:41:12 +0300 Subject: [PATCH 29/53] Update last_players.txt --- scripts/last_players.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/last_players.txt b/scripts/last_players.txt index 8b13789..8028527 100644 --- a/scripts/last_players.txt +++ b/scripts/last_players.txt @@ -1 +1 @@ - +[] From 5b5f6324f39583f835861ab27d935a1d87e98e7c Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:43:36 +0300 Subject: [PATCH 30/53] Update check.py --- scripts/check.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/check.py b/scripts/check.py index 8947b92..d7dd771 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,7 +1,7 @@ import os, json, requests from mcstatus import JavaServer -SERVER = JavaServer.lookup("yaneznau.peniscraft.pro:25565") +SERVER = JavaServer.lookup("yaneznau.peniscraft.pro") BOT = os.environ["TELEGRAM_BOT_TOKEN"] CHAT = os.environ["TELEGRAM_CHAT_ID"] From 875ddb302af808fa476ecf1576049bba98c5ea3f Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:47:19 +0300 Subject: [PATCH 31/53] Update check.yml --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 729dcd9..b439c5e 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,7 +1,7 @@ name: Minecraft monitor on: schedule: - - cron: '*/5 * * * *' + - cron: '*/2 * * * *' workflow_dispatch: {} jobs: From 80e0d7a4b5fb641b7af4e19a6ba333c99c92b36c Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:48:08 +0300 Subject: [PATCH 32/53] Update check.py --- scripts/check.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/check.py b/scripts/check.py index d7dd771..4b8ad04 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,7 +1,9 @@ import os, json, requests from mcstatus import JavaServer +# Адрес сервера (порт можно не указывать, если стандартный 25565) SERVER = JavaServer.lookup("yaneznau.peniscraft.pro") + BOT = os.environ["TELEGRAM_BOT_TOKEN"] CHAT = os.environ["TELEGRAM_CHAT_ID"] @@ -24,11 +26,15 @@ def write_last(players: set): last = read_last() +# --- Получаем игроков --- try: + # Пробуем полный query (работает только если enable-query=true на сервере) status = SERVER.query() current = set(status.players.names or []) except Exception: - current = set() + # Если query недоступен, fallback на status() + status = SERVER.status() + current = set([p.name for p in (status.players.sample or [])]) joined = current - last left = last - current From a62fc222fdaae31055ff4a15a4925edcff597ffa Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 18:57:16 +0300 Subject: [PATCH 33/53] Update check.yml --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index b439c5e..729dcd9 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,7 +1,7 @@ name: Minecraft monitor on: schedule: - - cron: '*/2 * * * *' + - cron: '*/5 * * * *' workflow_dispatch: {} jobs: From 033eef76fbf57a552ed7ebfe2cf9ed09a1fffe95 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 19:02:57 +0300 Subject: [PATCH 34/53] Update check.yml --- .github/workflows/check.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 729dcd9..f77d0b1 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -17,6 +17,12 @@ jobs: python-version: '3.10' - name: Install deps run: pip install mcstatus requests + - name: Debug workspace + run: | + echo "=== Содержимое репозитория ===" + ls -la + echo "=== scripts/ ===" + ls -la scripts || echo "scripts/ не найдена" - name: Run checker env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} From 13198840f41a584b8f194670d25e8f13fc121297 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 19:05:55 +0300 Subject: [PATCH 35/53] Update check.py --- scripts/check.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/check.py b/scripts/check.py index 4b8ad04..4bac8f6 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,6 +1,6 @@ import os, json, requests from mcstatus import JavaServer - +print("=== check.py started ===") # Адрес сервера (порт можно не указывать, если стандартный 25565) SERVER = JavaServer.lookup("yaneznau.peniscraft.pro") @@ -47,3 +47,4 @@ def write_last(players: set): # Записываем текущее состояние ВСЕГДА write_last(current) +print("=== check.py finished ===") From 3869b91d050d936c5cbc22558e5cb8151d3f59ee Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 19:10:05 +0300 Subject: [PATCH 36/53] Update check.py --- scripts/check.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 4bac8f6..cbd2953 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,6 +1,8 @@ -import os, json, requests +import os +import json +import requests from mcstatus import JavaServer -print("=== check.py started ===") + # Адрес сервера (порт можно не указывать, если стандартный 25565) SERVER = JavaServer.lookup("yaneznau.peniscraft.pro") @@ -24,6 +26,8 @@ def write_last(players: set): with open("scripts/last_players.txt", "w", encoding="utf-8") as f: f.write(json.dumps(list(players), ensure_ascii=False)) +print("=== check.py started ===") + last = read_last() # --- Получаем игроков --- @@ -31,10 +35,13 @@ def write_last(players: set): # Пробуем полный query (работает только если enable-query=true на сервере) status = SERVER.query() current = set(status.players.names or []) -except Exception: + print("Игроки через query():", current) +except Exception as e: + print("Query недоступен:", e) # Если query недоступен, fallback на status() status = SERVER.status() current = set([p.name for p in (status.players.sample or [])]) + print("Игроки через status():", current) joined = current - last left = last - current @@ -47,4 +54,6 @@ def write_last(players: set): # Записываем текущее состояние ВСЕГДА write_last(current) + +print("Игроки (final current):", current) print("=== check.py finished ===") From 8e6b4534da304eeb5ec6e50833446dcf9cbe8a47 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 20:12:33 +0300 Subject: [PATCH 37/53] Update check.yml --- .github/workflows/check.yml | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index f77d0b1..7c3b3d8 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,7 +1,31 @@ name: Minecraft monitor + on: schedule: - - cron: '*/5 * * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 0 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 1 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 2 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 3 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 4 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 5 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 6 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 7 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 8 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 9 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 10 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 11 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 12 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 13 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 14 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 15 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 16 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 17 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 18 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 19 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 20 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 21 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 22 * * *' + - cron: '0,5,10,15,20,25,30,35,40,45,50,55 23 * * *' workflow_dispatch: {} jobs: @@ -11,18 +35,22 @@ jobs: - uses: actions/checkout@v4 with: persist-credentials: false + - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.10' + - name: Install deps run: pip install mcstatus requests + - name: Debug workspace run: | echo "=== Содержимое репозитория ===" ls -la echo "=== scripts/ ===" ls -la scripts || echo "scripts/ не найдена" + - name: Run checker env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} From 7242bcaa603efd6d57670269c8179ac88961d28e Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 20:42:35 +0300 Subject: [PATCH 38/53] Update check.yml --- .github/workflows/check.yml | 36 ++++-------------------------------- 1 file changed, 4 insertions(+), 32 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 7c3b3d8..4679400 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,31 +1,7 @@ name: Minecraft monitor - on: schedule: - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 0 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 1 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 2 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 3 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 4 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 5 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 6 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 7 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 8 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 9 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 10 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 11 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 12 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 13 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 14 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 15 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 16 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 17 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 18 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 19 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 20 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 21 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 22 * * *' - - cron: '0,5,10,15,20,25,30,35,40,45,50,55 23 * * *' + - cron: '*/5 * * * *' workflow_dispatch: {} jobs: @@ -35,24 +11,20 @@ jobs: - uses: actions/checkout@v4 with: persist-credentials: false - - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.10' - - name: Install deps run: pip install mcstatus requests - - name: Debug workspace run: | echo "=== Содержимое репозитория ===" ls -la echo "=== scripts/ ===" ls -la scripts || echo "scripts/ не найдена" - - name: Run checker env: - TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} - TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} - run: python scripts/check.py + TELEGRAMBOTTOKEN: ${{ secrets.TELEGRAMBOTTOKEN }} + TELEGRAMCHATID: ${{ secrets.TELEGRAMCHATID }} + run: python scripts/check.py From 3506c14aec28105c4a4bd2abad78caa0fea942e4 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Thu, 11 Dec 2025 21:38:37 +0300 Subject: [PATCH 39/53] Update check.yml --- .github/workflows/check.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4679400..5dd4e1d 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -25,6 +25,6 @@ jobs: ls -la scripts || echo "scripts/ не найдена" - name: Run checker env: - TELEGRAMBOTTOKEN: ${{ secrets.TELEGRAMBOTTOKEN }} - TELEGRAMCHATID: ${{ secrets.TELEGRAMCHATID }} - run: python scripts/check.py + TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} + TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} + run: python scripts/check.py From fbb5f2fcc2c12b9b501a11018ec8470a93e381e5 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 12:59:52 +0300 Subject: [PATCH 40/53] Update check.py --- scripts/check.py | 123 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 85 insertions(+), 38 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index cbd2953..d56532e 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,59 +1,106 @@ +#!/usr/bin/env python3 +# scripts/check.py import os import json +import time +import logging +from typing import Set import requests from mcstatus import JavaServer -# Адрес сервера (порт можно не указывать, если стандартный 25565) -SERVER = JavaServer.lookup("yaneznau.peniscraft.pro") +logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") -BOT = os.environ["TELEGRAM_BOT_TOKEN"] -CHAT = os.environ["TELEGRAM_CHAT_ID"] +SERVER_ADDR = os.environ.get("MC_HOST", "yaneznau.peniscraft.pro") +SERVER = JavaServer.lookup(SERVER_ADDR) + +BOT = os.environ.get("TELEGRAM_BOT_TOKEN") +CHAT = os.environ.get("TELEGRAM_CHAT_ID") +STATE_PATH = os.path.join("scripts", "last_players.txt") +REQUEST_TIMEOUT = float(os.environ.get("MC_TIMEOUT", 5.0)) + +if not BOT or not CHAT: + logging.error("TELEGRAM_BOT_TOKEN или TELEGRAM_CHAT_ID не заданы в окружении") + raise SystemExit(1) def send(text: str): - requests.post( - f"https://api.telegram.org/bot{BOT}/sendMessage", - data={"chat_id": CHAT, "text": text} - ) + try: + r = requests.post( + f"https://api.telegram.org/bot{BOT}/sendMessage", + data={"chat_id": CHAT, "text": text, "parse_mode": "Markdown"}, + timeout=10 + ) + r.raise_for_status() + except Exception as e: + logging.exception("Ошибка при отправке Telegram: %s", e) -def read_last(): +def read_last() -> Set[str]: try: - with open("scripts/last_players.txt", "r", encoding="utf-8") as f: - return set(json.loads(f.read() or "[]")) + with open(STATE_PATH, "r", encoding="utf-8") as f: + data = json.load(f) + return set(data or []) + except FileNotFoundError: + logging.info("Файл состояния не найден, считаем что никто не был онлайн") + return set() except Exception: + logging.exception("Не удалось прочитать файл состояния, возвращаю пустой набор") return set() -def write_last(players: set): - with open("scripts/last_players.txt", "w", encoding="utf-8") as f: - f.write(json.dumps(list(players), ensure_ascii=False)) +def write_last(players: Set[str]): + try: + os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) + with open(STATE_PATH, "w", encoding="utf-8") as f: + json.dump(sorted(list(players)), f, ensure_ascii=False) + except Exception: + logging.exception("Не удалось сохранить файл состояния") + +def get_players(): + try: + q = SERVER.query(timeout=REQUEST_TIMEOUT) + players = set(q.players.names or []) + logging.info("Получено через query(): %s", players) + return players, "query" + except Exception as e: + logging.info("Query недоступен (%s), пробую status()", e) + try: + s = SERVER.status(timeout=REQUEST_TIMEOUT) + sample = s.players.sample or [] + players = set([p.name for p in sample if getattr(p, "name", None)]) + logging.info("Получено через status(): %s", players) + return players, "status" + except Exception as e: + logging.exception("Не удалось получить статус сервера: %s", e) + return set(), "error" -print("=== check.py started ===") +def main(): + logging.info("=== check.py started ===") + last = read_last() + current, method = get_players() -last = read_last() + joined = sorted(list(current - last)) + left = sorted(list(last - current)) -# --- Получаем игроков --- -try: - # Пробуем полный query (работает только если enable-query=true на сервере) - status = SERVER.query() - current = set(status.players.names or []) - print("Игроки через query():", current) -except Exception as e: - print("Query недоступен:", e) - # Если query недоступен, fallback на status() - status = SERVER.status() - current = set([p.name for p in (status.players.sample or [])]) - print("Игроки через status():", current) + if joined: + logging.info("Зашли: %s", joined) + for p in joined: + send(f"👤 *Игрок {p} зашёл на сервер.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") + if left: + logging.info("Вышли: %s", left) + for p in left: + send(f"🚪 *Игрок {p} вышел с сервера.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") -joined = current - last -left = last - current + # Если изменений нет — логируем, но не спамим Telegram + if not joined and not left: + logging.info("Изменений в составе нет. Сейчас: %s", ", ".join(sorted(current)) if current else "никого") -for p in joined: - send(f"👤 Игрок {p} зашёл на сервер.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") + # Всегда сохраняем текущее состояние (важно для локального запуска) + write_last(current) -for p in left: - send(f"🚪 Игрок {p} вышел с сервера.\n📊 Сейчас {len(current)} игроков: {', '.join(current) if current else 'никого'}") + # Краткая сводка (одним сообщением, опционально) + summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" + logging.info("Summary: %s", summary) + send(summary) # раскомментируй, если хочешь получать сводку каждый запуск -# Записываем текущее состояние ВСЕГДА -write_last(current) + logging.info("=== check.py finished ===") -print("Игроки (final current):", current) -print("=== check.py finished ===") +if __name__ == "__main__": + main() From b8909fb7d9feb2e312e62a01d300a872e7c64392 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 13:01:05 +0300 Subject: [PATCH 41/53] Update check.yml --- .github/workflows/check.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 5dd4e1d..4d8ba4b 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,4 +1,5 @@ name: Minecraft monitor + on: schedule: - cron: '*/5 * * * *' @@ -11,20 +12,26 @@ jobs: - uses: actions/checkout@v4 with: persist-credentials: false + - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.10' + - name: Install deps run: pip install mcstatus requests + - name: Debug workspace run: | echo "=== Содержимое репозитория ===" ls -la echo "=== scripts/ ===" ls -la scripts || echo "scripts/ не найдена" + - name: Run checker env: TELEGRAM_BOT_TOKEN: ${{ secrets.TELEGRAM_BOT_TOKEN }} TELEGRAM_CHAT_ID: ${{ secrets.TELEGRAM_CHAT_ID }} - run: python scripts/check.py + MC_HOST: "yaneznau.peniscraft.pro" + MC_TIMEOUT: "5" + run: python scripts/check.py From 3fe8123a1684b39d385e1e2456b6fbf6a40be4d0 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 13:05:41 +0300 Subject: [PATCH 42/53] Update check.py --- scripts/check.py | 53 ++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index d56532e..009367e 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -2,8 +2,8 @@ # scripts/check.py import os import json -import time import logging +import socket from typing import Set import requests from mcstatus import JavaServer @@ -30,8 +30,8 @@ def send(text: str): timeout=10 ) r.raise_for_status() - except Exception as e: - logging.exception("Ошибка при отправке Telegram: %s", e) + except Exception: + logging.exception("Ошибка при отправке Telegram") def read_last() -> Set[str]: try: @@ -54,22 +54,33 @@ def write_last(players: Set[str]): logging.exception("Не удалось сохранить файл состояния") def get_players(): + """ + Используем временную установку системного таймаута сокетов, + чтобы не передавать timeout как именованный аргумент в mcstatus, + совместимо с разными версиями mcstatus. + """ + old_timeout = socket.getdefaulttimeout() + socket.setdefaulttimeout(REQUEST_TIMEOUT) try: - q = SERVER.query(timeout=REQUEST_TIMEOUT) - players = set(q.players.names or []) - logging.info("Получено через query(): %s", players) - return players, "query" - except Exception as e: - logging.info("Query недоступен (%s), пробую status()", e) - try: - s = SERVER.status(timeout=REQUEST_TIMEOUT) - sample = s.players.sample or [] - players = set([p.name for p in sample if getattr(p, "name", None)]) - logging.info("Получено через status(): %s", players) - return players, "status" - except Exception as e: - logging.exception("Не удалось получить статус сервера: %s", e) - return set(), "error" + try: + q = SERVER.query() # не передаём timeout=..., чтобы избежать ошибок в разных версиях mcstatus + players = set(q.players.names or []) + logging.info("Получено через query(): %s", players) + return players, "query" + except Exception as e: + logging.info("Query недоступен (%s), пробую status()", e) + + try: + s = SERVER.status() + sample = s.players.sample or [] + players = set([p.name for p in sample if getattr(p, "name", None)]) + logging.info("Получено через status(): %s", players) + return players, "status" + except Exception as e: + logging.exception("Не удалось получить статус сервера: %s", e) + return set(), "error" + finally: + socket.setdefaulttimeout(old_timeout) def main(): logging.info("=== check.py started ===") @@ -88,17 +99,15 @@ def main(): for p in left: send(f"🚪 *Игрок {p} вышел с сервера.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") - # Если изменений нет — логируем, но не спамим Telegram if not joined and not left: logging.info("Изменений в составе нет. Сейчас: %s", ", ".join(sorted(current)) if current else "никого") - # Всегда сохраняем текущее состояние (важно для локального запуска) write_last(current) - # Краткая сводка (одним сообщением, опционально) summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" logging.info("Summary: %s", summary) - send(summary) # раскомментируй, если хочешь получать сводку каждый запуск + # Отправляем сводку один раз за запуск (если не нужно — закомментируй) + send(summary) logging.info("=== check.py finished ===") From d12f9ed6cea50851eeb370218a7242ee6de7efde Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 13:15:14 +0300 Subject: [PATCH 43/53] Update check.py --- scripts/check.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 009367e..64e80b8 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -64,7 +64,7 @@ def get_players(): try: try: q = SERVER.query() # не передаём timeout=..., чтобы избежать ошибок в разных версиях mcstatus - players = set(q.players.names or []) + players = set(q.players.list or []) logging.info("Получено через query(): %s", players) return players, "query" except Exception as e: @@ -107,7 +107,12 @@ def main(): summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" logging.info("Summary: %s", summary) # Отправляем сводку один раз за запуск (если не нужно — закомментируй) - send(summary) + if joined or left: + send(summary) + else: + logging.info("Сводка не отправлена, так как изменений нет") + if method == "query" and not current: + logging.info("query вернул пустой список, значит либо на сервере никого нет, либо query работает некорректно") logging.info("=== check.py finished ===") From 266d26905622adedf47ace87bfa110851822198f Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 14:33:31 +0300 Subject: [PATCH 44/53] Update last_players.txt --- scripts/last_players.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/last_players.txt b/scripts/last_players.txt index 8028527..8b13789 100644 --- a/scripts/last_players.txt +++ b/scripts/last_players.txt @@ -1 +1 @@ -[] + From 9ade564292b88fce853b93ad24f5589b40208a84 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 15:02:31 +0300 Subject: [PATCH 45/53] Update check.py --- scripts/check.py | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 64e80b8..c3029e6 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -10,6 +10,7 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") +# Конфигурация SERVER_ADDR = os.environ.get("MC_HOST", "yaneznau.peniscraft.pro") SERVER = JavaServer.lookup(SERVER_ADDR) @@ -22,6 +23,7 @@ logging.error("TELEGRAM_BOT_TOKEN или TELEGRAM_CHAT_ID не заданы в окружении") raise SystemExit(1) +# --- Telegram --- def send(text: str): try: r = requests.post( @@ -33,10 +35,15 @@ def send(text: str): except Exception: logging.exception("Ошибка при отправке Telegram") +# --- Работа с файлом состояния --- def read_last() -> Set[str]: try: with open(STATE_PATH, "r", encoding="utf-8") as f: - data = json.load(f) + content = f.read().strip() + if not content: + logging.info("Файл состояния пустой, считаем что никто не был онлайн") + return set() + data = json.loads(content) return set(data or []) except FileNotFoundError: logging.info("Файл состояния не найден, считаем что никто не был онлайн") @@ -53,17 +60,14 @@ def write_last(players: Set[str]): except Exception: logging.exception("Не удалось сохранить файл состояния") +# --- Получение игроков --- def get_players(): - """ - Используем временную установку системного таймаута сокетов, - чтобы не передавать timeout как именованный аргумент в mcstatus, - совместимо с разными версиями mcstatus. - """ old_timeout = socket.getdefaulttimeout() socket.setdefaulttimeout(REQUEST_TIMEOUT) try: try: - q = SERVER.query() # не передаём timeout=..., чтобы избежать ошибок в разных версиях mcstatus + q = SERVER.query() + # используем list вместо names (names устарело) players = set(q.players.list or []) logging.info("Получено через query(): %s", players) return players, "query" @@ -82,6 +86,7 @@ def get_players(): finally: socket.setdefaulttimeout(old_timeout) +# --- Основная логика --- def main(): logging.info("=== check.py started ===") last = read_last() @@ -106,13 +111,8 @@ def main(): summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" logging.info("Summary: %s", summary) - # Отправляем сводку один раз за запуск (если не нужно — закомментируй) - if joined or left: - send(summary) - else: - logging.info("Сводка не отправлена, так как изменений нет") - if method == "query" and not current: - logging.info("query вернул пустой список, значит либо на сервере никого нет, либо query работает некорректно") + # Отправляем сводку каждый запуск (если не нужно — закомментируй) + send(summary) logging.info("=== check.py finished ===") From 9b12983eb5cc7127095e44dc0c04ff7216032ff5 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 15:14:15 +0300 Subject: [PATCH 46/53] Update check.py --- scripts/check.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/check.py b/scripts/check.py index c3029e6..1b67d87 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -56,7 +56,11 @@ def write_last(players: Set[str]): try: os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) with open(STATE_PATH, "w", encoding="utf-8") as f: + # всегда пишем список игроков в JSON json.dump(sorted(list(players)), f, ensure_ascii=False) + f.flush() # принудительно сбросить буфер + os.fsync(f.fileno()) # гарантировать запись на диск + logging.info("Состояние сохранено: %s", players) except Exception: logging.exception("Не удалось сохранить файл состояния") @@ -113,7 +117,9 @@ def main(): logging.info("Summary: %s", summary) # Отправляем сводку каждый запуск (если не нужно — закомментируй) send(summary) - + now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + send(f"--------------\n🕒 Сеанс завершён: {now}\n--------------") + logging.info("=== check.py finished ===") if __name__ == "__main__": From d97bce551f838bd8fe2200b63d1aaedaf856b021 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Fri, 12 Dec 2025 15:17:18 +0300 Subject: [PATCH 47/53] Update check.py --- scripts/check.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/check.py b/scripts/check.py index 1b67d87..7c4a9bd 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -7,6 +7,7 @@ from typing import Set import requests from mcstatus import JavaServer +import datetime logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") From 8bc02136ea4a474577c7396e4ea5cfadbc7be275 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Mon, 15 Dec 2025 07:45:04 +0300 Subject: [PATCH 48/53] Update check.py --- scripts/check.py | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 7c4a9bd..89aae59 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,3 +1,4 @@ + #!/usr/bin/env python3 # scripts/check.py import os @@ -57,10 +58,9 @@ def write_last(players: Set[str]): try: os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) with open(STATE_PATH, "w", encoding="utf-8") as f: - # всегда пишем список игроков в JSON json.dump(sorted(list(players)), f, ensure_ascii=False) - f.flush() # принудительно сбросить буфер - os.fsync(f.fileno()) # гарантировать запись на диск + f.flush() + os.fsync(f.fileno()) logging.info("Состояние сохранено: %s", players) except Exception: logging.exception("Не удалось сохранить файл состояния") @@ -72,19 +72,24 @@ def get_players(): try: try: q = SERVER.query() - # используем list вместо names (names устарело) players = set(q.players.list or []) - logging.info("Получено через query(): %s", players) - return players, "query" + if players: + logging.info("Получено через query(): %s", players) + return players, "query" + else: + logging.info("Query вернул пусто, пробую status()") except Exception as e: logging.info("Query недоступен (%s), пробую status()", e) try: s = SERVER.status() - sample = s.players.sample or [] - players = set([p.name for p in sample if getattr(p, "name", None)]) - logging.info("Получено через status(): %s", players) - return players, "status" + if s.players.sample: + players = {p.name for p in s.players.sample if getattr(p, "name", None)} + logging.info("Получено через status(): %s", players) + return players, "status" + else: + logging.info("Status.sample пустой, игроков не получено") + return set(), "status" except Exception as e: logging.exception("Не удалось получить статус сервера: %s", e) return set(), "error" @@ -97,6 +102,11 @@ def main(): last = read_last() current, method = get_players() + # если список пустой, не затираем состояние + if not current and last: + logging.info("Игроков не получено, оставляю предыдущее состояние") + current = last + joined = sorted(list(current - last)) left = sorted(list(last - current)) @@ -110,17 +120,18 @@ def main(): send(f"🚪 *Игрок {p} вышел с сервера.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") if not joined and not left: - logging.info("Изменений в составе нет. Сейчас: %s", ", ".join(sorted(current)) if current else "никого") + logging.info("Изменений в составе нет. Сейчас: %s", ', '.join(sorted(current)) if current else "никого") - write_last(current) + # обновляем файл только если список не пустой + if current: + write_last(current) summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" logging.info("Summary: %s", summary) - # Отправляем сводку каждый запуск (если не нужно — закомментируй) send(summary) - now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - send(f"--------------\n🕒 Сеанс завершён: {now}\n--------------") - + now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + send(f"--------------\n🕒 Сеанс завершён: {now}\n--------------") + logging.info("=== check.py finished ===") if __name__ == "__main__": From 5816568f4be99711b1e6d8a81468b05be92abc8f Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Mon, 15 Dec 2025 07:51:00 +0300 Subject: [PATCH 49/53] Update check.py --- scripts/check.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 89aae59..556e5ae 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -43,25 +43,31 @@ def read_last() -> Set[str]: with open(STATE_PATH, "r", encoding="utf-8") as f: content = f.read().strip() if not content: - logging.info("Файл состояния пустой, считаем что никто не был онлайн") + logging.info("Файл состояния пустой") return set() data = json.loads(content) + # если в файле записано "никого" + if isinstance(data, str) and data == "никого": + return set() return set(data or []) except FileNotFoundError: - logging.info("Файл состояния не найден, считаем что никто не был онлайн") + logging.info("Файл состояния не найден") return set() except Exception: - logging.exception("Не удалось прочитать файл состояния, возвращаю пустой набор") + logging.exception("Не удалось прочитать файл состояния") return set() def write_last(players: Set[str]): try: os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) with open(STATE_PATH, "w", encoding="utf-8") as f: - json.dump(sorted(list(players)), f, ensure_ascii=False) + if players: + json.dump(sorted(list(players)), f, ensure_ascii=False) + else: + json.dump("никого", f, ensure_ascii=False) f.flush() os.fsync(f.fileno()) - logging.info("Состояние сохранено: %s", players) + logging.info("Состояние сохранено: %s", players if players else "никого") except Exception: logging.exception("Не удалось сохранить файл состояния") @@ -102,11 +108,6 @@ def main(): last = read_last() current, method = get_players() - # если список пустой, не затираем состояние - if not current and last: - logging.info("Игроков не получено, оставляю предыдущее состояние") - current = last - joined = sorted(list(current - last)) left = sorted(list(last - current)) @@ -122,9 +123,8 @@ def main(): if not joined and not left: logging.info("Изменений в составе нет. Сейчас: %s", ', '.join(sorted(current)) if current else "никого") - # обновляем файл только если список не пустой - if current: - write_last(current) + # всегда обновляем файл — если игроков нет, пишем "никого" + write_last(current) summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" logging.info("Summary: %s", summary) From 01aed34dfe86bc8d29352100da623c7b82d83fdc Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Wed, 17 Dec 2025 07:44:18 +0300 Subject: [PATCH 50/53] Update check.py --- scripts/check.py | 64 ++++++++++++++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 18 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 556e5ae..745b182 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -1,11 +1,10 @@ - #!/usr/bin/env python3 # scripts/check.py import os import json import logging import socket -from typing import Set +from typing import Set, Dict import requests from mcstatus import JavaServer import datetime @@ -13,12 +12,15 @@ logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s: %(message)s") # Конфигурация +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +STATE_PATH = os.path.join(BASE_DIR, "last_players.txt") +PLAYTIME_PATH = os.path.join(BASE_DIR, "playtime.json") + SERVER_ADDR = os.environ.get("MC_HOST", "yaneznau.peniscraft.pro") SERVER = JavaServer.lookup(SERVER_ADDR) BOT = os.environ.get("TELEGRAM_BOT_TOKEN") CHAT = os.environ.get("TELEGRAM_CHAT_ID") -STATE_PATH = os.path.join("scripts", "last_players.txt") REQUEST_TIMEOUT = float(os.environ.get("MC_TIMEOUT", 5.0)) if not BOT or not CHAT: @@ -43,15 +45,12 @@ def read_last() -> Set[str]: with open(STATE_PATH, "r", encoding="utf-8") as f: content = f.read().strip() if not content: - logging.info("Файл состояния пустой") return set() data = json.loads(content) - # если в файле записано "никого" if isinstance(data, str) and data == "никого": return set() return set(data or []) except FileNotFoundError: - logging.info("Файл состояния не найден") return set() except Exception: logging.exception("Не удалось прочитать файл состояния") @@ -59,7 +58,6 @@ def read_last() -> Set[str]: def write_last(players: Set[str]): try: - os.makedirs(os.path.dirname(STATE_PATH), exist_ok=True) with open(STATE_PATH, "w", encoding="utf-8") as f: if players: json.dump(sorted(list(players)), f, ensure_ascii=False) @@ -71,6 +69,44 @@ def write_last(players: Set[str]): except Exception: logging.exception("Не удалось сохранить файл состояния") +# --- Учёт времени --- +def load_playtime() -> Dict[str, Dict]: + try: + with open(PLAYTIME_PATH, "r", encoding="utf-8") as f: + return json.load(f) + except FileNotFoundError: + return {} + except Exception: + logging.exception("Ошибка чтения playtime.json") + return {} + +def save_playtime(data: Dict[str, Dict]): + try: + with open(PLAYTIME_PATH, "w", encoding="utf-8") as f: + json.dump(data, f, ensure_ascii=False, indent=2) + f.flush() + os.fsync(f.fileno()) + except Exception: + logging.exception("Ошибка записи playtime.json") + +def update_playtime(joined, left): + data = load_playtime() + now = datetime.datetime.now().timestamp() + + for p in joined: + if p not in data: + data[p] = {"total": 0, "start": now} + else: + data[p]["start"] = now + + for p in left: + if p in data and "start" in data[p]: + session = now - data[p]["start"] + data[p]["total"] += int(session) + data[p].pop("start", None) + + save_playtime(data) + # --- Получение игроков --- def get_players(): old_timeout = socket.getdefaulttimeout() @@ -80,21 +116,16 @@ def get_players(): q = SERVER.query() players = set(q.players.list or []) if players: - logging.info("Получено через query(): %s", players) return players, "query" - else: - logging.info("Query вернул пусто, пробую status()") - except Exception as e: - logging.info("Query недоступен (%s), пробую status()", e) + except Exception: + logging.info("Query недоступен, пробую status()") try: s = SERVER.status() if s.players.sample: players = {p.name for p in s.players.sample if getattr(p, "name", None)} - logging.info("Получено через status(): %s", players) return players, "status" else: - logging.info("Status.sample пустой, игроков не получено") return set(), "status" except Exception as e: logging.exception("Не удалось получить статус сервера: %s", e) @@ -112,22 +143,19 @@ def main(): left = sorted(list(last - current)) if joined: - logging.info("Зашли: %s", joined) for p in joined: send(f"👤 *Игрок {p} зашёл на сервер.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") if left: - logging.info("Вышли: %s", left) for p in left: send(f"🚪 *Игрок {p} вышел с сервера.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") if not joined and not left: logging.info("Изменений в составе нет. Сейчас: %s", ', '.join(sorted(current)) if current else "никого") - # всегда обновляем файл — если игроков нет, пишем "никого" write_last(current) + update_playtime(joined, left) summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" - logging.info("Summary: %s", summary) send(summary) now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") send(f"--------------\n🕒 Сеанс завершён: {now}\n--------------") From 79bff7550a9b642bd2fd446df6165ade8a527699 Mon Sep 17 00:00:00 2001 From: d13225135-netizen Date: Wed, 17 Dec 2025 07:49:55 +0300 Subject: [PATCH 51/53] Update check.yml --- .github/workflows/check.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 4d8ba4b..0d5c8a0 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -35,3 +35,10 @@ jobs: MC_HOST: "yaneznau.peniscraft.pro" MC_TIMEOUT: "5" run: python scripts/check.py + - name: Upload state files + uses: actions/upload-artifact@v4 + with: + name: minecraft-state + path: | + scripts/last_players.txt + scripts/playtime.json From 554ee6e22ebd3ba57f6bff11da40a7874b68928c Mon Sep 17 00:00:00 2001 From: Daniil Date: Wed, 24 Dec 2025 00:01:58 +0300 Subject: [PATCH 52/53] Update check.py --- scripts/check.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 745b182..5d322c5 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -149,8 +149,8 @@ def main(): for p in left: send(f"🚪 *Игрок {p} вышел с сервера.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") - if not joined and not left: - logging.info("Изменений в составе нет. Сейчас: %s", ', '.join(sorted(current)) if current else "никого") + # if not joined and not left: + # logging.info("Изменений в составе нет. Сейчас: %s", ', '.join(sorted(current)) if current else "никого") write_last(current) update_playtime(joined, left) From 900a2b630ac49c421666a8761f1a9da4fea06b06 Mon Sep 17 00:00:00 2001 From: Daniil Date: Fri, 26 Dec 2025 17:10:24 +0300 Subject: [PATCH 53/53] Update check.py --- scripts/check.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/scripts/check.py b/scripts/check.py index 5d322c5..837a3f2 100644 --- a/scripts/check.py +++ b/scripts/check.py @@ -149,16 +149,25 @@ def main(): for p in left: send(f"🚪 *Игрок {p} вышел с сервера.*\n📊 Сейчас {len(current)} игроков: {', '.join(sorted(current)) if current else 'никого'}") - # if not joined and not left: - # logging.info("Изменений в составе нет. Сейчас: %s", ', '.join(sorted(current)) if current else "никого") + if not joined and not left: + logging.info("Изменений в составе нет. Сейчас: %s", ', '.join(sorted(current)) if current else "никого") write_last(current) update_playtime(joined, left) - summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current)) if current else 'никого'}" - send(summary) - now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") - send(f"--------------\n🕒 Сеанс завершён: {now}\n--------------") + # --- Итоговые сообщения --- + # Отправляем только если есть игроки + if current: + summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* {', '.join(sorted(current))}" + send(summary) + now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + send(f"--------------\n🕒 Сеанс завершён: {now}\n--------------") + + # Если никого нет — эта часть закомментирована, чтобы бот не отправлял сообщения + # summary = f"*Сервер:* `{SERVER_ADDR}`\n*Метод:* {method}\n*Игроки сейчас:* никого" + # send(summary) + # now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") + # send(f"--------------\n🕒 Сеанс завершён: {now}\n--------------") logging.info("=== check.py finished ===")