From 28be3105b69c1195b8d72a45b93b1dafbd034954 Mon Sep 17 00:00:00 2001 From: Slfhstd Date: Wed, 11 Mar 2026 23:29:13 +0000 Subject: [PATCH] bedrock support --- .env.example | 4 ++ DOCKER.md | 1 + README.md | 30 +++++++++++ WIKI_CONFIG.md | 23 +++++++-- bedrock_checker.py | 123 +++++++++++++++++++++++++++++++++++++++++++++ config.py | 4 ++ main.py | 25 +++++++-- 7 files changed, 200 insertions(+), 10 deletions(-) create mode 100644 bedrock_checker.py diff --git a/.env.example b/.env.example index 9772c69..7190076 100644 --- a/.env.example +++ b/.env.example @@ -21,6 +21,10 @@ SUBREDDIT=YOUR_SUBREDDIT_HERE # Multiple: RELEASE_TYPES=release,snapshot RELEASE_TYPES=release +# Optional: Check for Bedrock Edition releases (Windows) +# true to enable, false to disable +CHECK_BEDROCK=false + # Optional: how often to check for updates (in seconds) # Default: 3600 (1 hour) # For testing: 600 (10 minutes) diff --git a/DOCKER.md b/DOCKER.md index 4219f19..5dc5633 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -73,6 +73,7 @@ All configuration is done via the `.env` file. The following variables are avail | `REDDIT_PASSWORD` | ✓ | - | Your Reddit password | | `SUBREDDIT` | ✓ | - | Subreddit to post to | | `RELEASE_TYPES` | | `release` | Comma-separated: `release,snapshot` | +| `CHECK_BEDROCK` | | `false` | Enable Bedrock Edition detection: `true` or `false` | | `CHECK_INTERVAL` | | `3600` | Seconds between checks | | `REDDIT_USER_AGENT` | | `MinecraftUpdateBot/1.0` | API user agent | diff --git a/README.md b/README.md index 67e0630..060f2dd 100644 --- a/README.md +++ b/README.md @@ -9,6 +9,7 @@ Automatically detects new Minecraft releases and posts them to a subreddit. - ✅ Tracks posted versions to avoid duplicates - ✅ Runs continuously with configurable check interval - ✅ Supports multiple release types (releases, snapshots, etc.) +- ✅ **Bedrock Edition support** - Detects Windows Bedrock releases - ✅ Docker & Docker Compose ready - ✅ **Customizable post templates via subreddit wiki** - ✅ **Different post formats for different release types** @@ -60,6 +61,35 @@ snapshot: 👉 See [WIKI_CONFIG.md](WIKI_CONFIG.md) for complete setup and examples. +## Bedrock Edition Support + +The bot can track **Minecraft Bedrock Edition (Windows)** releases in addition to Java Edition. + +**To enable Bedrock tracking:** + +1. **With Docker:** Add to your `.env` file: + ``` + CHECK_BEDROCK=true + ``` + +2. **Manual:** Set environment variable before running: + ```bash + set CHECK_BEDROCK=true + python main.py + ``` + +3. **Configure Bedrock posts** in your wiki page (optional): + ```yaml + bedrock-windows: + title: "Minecraft Bedrock {version} Available (Windows)" + body: | + # Bedrock Edition {version} + Download from the Microsoft Store + **Released:** {release_date} + ``` + +The bot will now check for both Java and Bedrock releases every cycle, posting about each separately. + ## Manual Setup ### 1. Install Dependencies diff --git a/WIKI_CONFIG.md b/WIKI_CONFIG.md index a4df1f2..cb8c6be 100644 --- a/WIKI_CONFIG.md +++ b/WIKI_CONFIG.md @@ -19,7 +19,7 @@ release: body: | # Minecraft {version} Released - A new version of Minecraft is now available! + A new version of Minecraft Java Edition is now available! **Version:** {version} **Released:** {release_date} @@ -38,6 +38,18 @@ snapshot: Try it in the launcher with the development profiles. +bedrock-windows: + title: "Minecraft Bedrock Edition {version} Available (Windows)" + body: | + # Minecraft Bedrock Edition {version} + + A new version is available for Windows! + + **Version:** {version} + **Released:** {release_date} + + Download from the Microsoft Store or via the Minecraft Launcher. + default: title: "Minecraft {version} ({type})" body: | @@ -75,10 +87,11 @@ In both title and body, you can use: ### Release Types Create sections for each release type you want custom posts for: -- `release` - Final releases -- `snapshot` - Snapshots -- `old_beta` - Old beta versions -- `old_alpha` - Old alpha versions +- `release` - Java Edition final releases +- `snapshot` - Java Edition snapshots +- `old_beta` - Java Edition old beta versions +- `old_alpha` - Java Edition old alpha versions +- `bedrock-windows` - Bedrock Edition (Windows) - `default` - Fallback for any unconfigured type ## Examples diff --git a/bedrock_checker.py b/bedrock_checker.py new file mode 100644 index 0000000..18f4af3 --- /dev/null +++ b/bedrock_checker.py @@ -0,0 +1,123 @@ +""" +Minecraft Bedrock Edition version checker - tracks Windows releases +""" + +import requests +import json +from datetime import datetime + +# Bedrock version tracking endpoints +# Using third-party services that track Bedrock version history +BEDROCK_VERSIONS_URL = "https://raw.githubusercontent.com/pmmp/PocketMine-MP/master/src/VersionInfo.php" + +# Alternative: Direct launcher check (if available) +BEDROCK_LAUNCHER_API = "https://launcher.mojang.com/v1/products/bedrock-launcher/latest" + +TIMEOUT = 10 + + +def get_bedrock_versions(): + """ + Fetch Bedrock version information. + Attempts multiple sources for reliability. + + Returns: + Dict with version info or None + """ + # Try the launcher API first + try: + response = requests.get(BEDROCK_LAUNCHER_API, timeout=TIMEOUT) + if response.status_code == 200: + data = response.json() + if data: + return data + except Exception as e: + print(f"[BEDROCK_CHECKER] Launcher API error: {e}") + + # Fallback: try Windows version manifest + try: + # Query Microsoft's update service for Bedrock + response = requests.get( + "https://launcher.mojang.com/v1/products/bedrock-launcher/16/latest", + headers={"Accept": "application/json"}, + timeout=TIMEOUT + ) + if response.status_code == 200: + return response.json() + except Exception as e: + print(f"[BEDROCK_CHECKER] Manifest error: {e}") + + return None + + +def parse_bedrock_version(response_data): + """ + Parse response data into standardized version format. + + Args: + response_data: JSON response from version endpoint + + Returns: + Dict with keys: id, version, type, releaseTime + """ + if not response_data: + return None + + try: + # Extract version information from different possible response formats + version = response_data.get('version') or response_data.get('latest') + + if not version: + return None + + return { + "id": version, + "version": version, + "type": "bedrock-windows", + "releaseTime": response_data.get('releaseTime', datetime.utcnow().isoformat() + "+00:00"), + "platform": "windows" + } + except Exception as e: + print(f"[BEDROCK_CHECKER] Parse error: {e}") + return None + + +def get_latest_bedrock_release(): + """ + Get the latest Bedrock Windows release. + + Returns: + Dict with version info or None + """ + try: + version_data = get_bedrock_versions() + return parse_bedrock_version(version_data) + except Exception as e: + print(f"[BEDROCK_CHECKER] Error getting latest release: {e}") + return None + + +def compare_versions(v1, v2): + """ + Compare two version strings (semantic versioning). + + Args: + v1, v2: Version strings like "1.20.0" + + Returns: + True if v1 > v2, False otherwise + """ + try: + parts1 = [int(x) for x in v1.split('.')] + parts2 = [int(x) for x in v2.split('.')] + + # Pad with zeros + while len(parts1) < len(parts2): + parts1.append(0) + while len(parts2) < len(parts1): + parts2.append(0) + + return parts1 > parts2 + except: + # Fallback to string comparison + return v1 > v2 diff --git a/config.py b/config.py index a9348c1..2b95aa5 100644 --- a/config.py +++ b/config.py @@ -17,6 +17,10 @@ SUBREDDIT = os.getenv("SUBREDDIT", "YOUR_SUBREDDIT") release_types_env = os.getenv("RELEASE_TYPES", "release") RELEASE_TYPES = [t.strip() for t in release_types_env.split(",")] +# Check for Bedrock Edition releases (Windows) +# Set to true to detect and post Bedrock releases +CHECK_BEDROCK = os.getenv("CHECK_BEDROCK", "false").lower() in ("true", "1", "yes") + # Post templates # NOTE: Post titles and bodies are now fetched from the subreddit wiki page "minecraft_update_bot" # See DOCKER.md or README.md for how to set up the wiki page with YAML configuration diff --git a/main.py b/main.py index ee82ef2..62cd816 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ import threading from datetime import datetime import config from minecraft_checker import get_latest_releases, parse_release_date +from bedrock_checker import get_latest_bedrock_release from wiki_config import WikiConfig from update_checker import start_update_checker @@ -112,24 +113,38 @@ def post_to_subreddit(reddit, version_info): def check_for_updates(reddit): """ - Check for new Minecraft releases and post if any are new. + Check for new Minecraft releases (Java & Bedrock) and post if any are new. Args: reddit: PRAW Reddit instance """ try: posted_versions = load_posted_versions() - latest_releases = get_latest_releases(config.RELEASE_TYPES) - for version_info in latest_releases: + # Check Java Edition releases + java_releases = get_latest_releases(config.RELEASE_TYPES) + for version_info in java_releases: version_id = version_info["id"] if version_id not in posted_versions: - print(f"[BOT] New release found: {version_id}") + print(f"[BOT] New Java release found: {version_id}") if post_to_subreddit(reddit, version_info): save_posted_version(version_id) else: - print(f"[BOT] Version {version_id} already posted, skipping") + print(f"[BOT] Java version {version_id} already posted, skipping") + + # Check Bedrock Edition releases if enabled + if config.CHECK_BEDROCK: + bedrock_release = get_latest_bedrock_release() + if bedrock_release: + bedrock_id = f"bedrock-{bedrock_release['version']}" + + if bedrock_id not in posted_versions: + print(f"[BOT] New Bedrock release found: {bedrock_release['version']}") + if post_to_subreddit(reddit, bedrock_release): + save_posted_version(bedrock_id) + else: + print(f"[BOT] Bedrock version {bedrock_release['version']} already posted, skipping") except Exception as e: print(f"[BOT] ✗ Error checking for updates: {e}")