bedrock support
This commit is contained in:
@@ -21,6 +21,10 @@ SUBREDDIT=YOUR_SUBREDDIT_HERE
|
|||||||
# Multiple: RELEASE_TYPES=release,snapshot
|
# Multiple: RELEASE_TYPES=release,snapshot
|
||||||
RELEASE_TYPES=release
|
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)
|
# Optional: how often to check for updates (in seconds)
|
||||||
# Default: 3600 (1 hour)
|
# Default: 3600 (1 hour)
|
||||||
# For testing: 600 (10 minutes)
|
# For testing: 600 (10 minutes)
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ All configuration is done via the `.env` file. The following variables are avail
|
|||||||
| `REDDIT_PASSWORD` | ✓ | - | Your Reddit password |
|
| `REDDIT_PASSWORD` | ✓ | - | Your Reddit password |
|
||||||
| `SUBREDDIT` | ✓ | - | Subreddit to post to |
|
| `SUBREDDIT` | ✓ | - | Subreddit to post to |
|
||||||
| `RELEASE_TYPES` | | `release` | Comma-separated: `release,snapshot` |
|
| `RELEASE_TYPES` | | `release` | Comma-separated: `release,snapshot` |
|
||||||
|
| `CHECK_BEDROCK` | | `false` | Enable Bedrock Edition detection: `true` or `false` |
|
||||||
| `CHECK_INTERVAL` | | `3600` | Seconds between checks |
|
| `CHECK_INTERVAL` | | `3600` | Seconds between checks |
|
||||||
| `REDDIT_USER_AGENT` | | `MinecraftUpdateBot/1.0` | API user agent |
|
| `REDDIT_USER_AGENT` | | `MinecraftUpdateBot/1.0` | API user agent |
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ Automatically detects new Minecraft releases and posts them to a subreddit.
|
|||||||
- ✅ Tracks posted versions to avoid duplicates
|
- ✅ Tracks posted versions to avoid duplicates
|
||||||
- ✅ Runs continuously with configurable check interval
|
- ✅ Runs continuously with configurable check interval
|
||||||
- ✅ Supports multiple release types (releases, snapshots, etc.)
|
- ✅ Supports multiple release types (releases, snapshots, etc.)
|
||||||
|
- ✅ **Bedrock Edition support** - Detects Windows Bedrock releases
|
||||||
- ✅ Docker & Docker Compose ready
|
- ✅ Docker & Docker Compose ready
|
||||||
- ✅ **Customizable post templates via subreddit wiki**
|
- ✅ **Customizable post templates via subreddit wiki**
|
||||||
- ✅ **Different post formats for different release types**
|
- ✅ **Different post formats for different release types**
|
||||||
@@ -60,6 +61,35 @@ snapshot:
|
|||||||
|
|
||||||
👉 See [WIKI_CONFIG.md](WIKI_CONFIG.md) for complete setup and examples.
|
👉 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
|
## Manual Setup
|
||||||
|
|
||||||
### 1. Install Dependencies
|
### 1. Install Dependencies
|
||||||
|
|||||||
+18
-5
@@ -19,7 +19,7 @@ release:
|
|||||||
body: |
|
body: |
|
||||||
# Minecraft {version} Released
|
# Minecraft {version} Released
|
||||||
|
|
||||||
A new version of Minecraft is now available!
|
A new version of Minecraft Java Edition is now available!
|
||||||
|
|
||||||
**Version:** {version}
|
**Version:** {version}
|
||||||
**Released:** {release_date}
|
**Released:** {release_date}
|
||||||
@@ -38,6 +38,18 @@ snapshot:
|
|||||||
|
|
||||||
Try it in the launcher with the development profiles.
|
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:
|
default:
|
||||||
title: "Minecraft {version} ({type})"
|
title: "Minecraft {version} ({type})"
|
||||||
body: |
|
body: |
|
||||||
@@ -75,10 +87,11 @@ In both title and body, you can use:
|
|||||||
### Release Types
|
### Release Types
|
||||||
|
|
||||||
Create sections for each release type you want custom posts for:
|
Create sections for each release type you want custom posts for:
|
||||||
- `release` - Final releases
|
- `release` - Java Edition final releases
|
||||||
- `snapshot` - Snapshots
|
- `snapshot` - Java Edition snapshots
|
||||||
- `old_beta` - Old beta versions
|
- `old_beta` - Java Edition old beta versions
|
||||||
- `old_alpha` - Old alpha versions
|
- `old_alpha` - Java Edition old alpha versions
|
||||||
|
- `bedrock-windows` - Bedrock Edition (Windows)
|
||||||
- `default` - Fallback for any unconfigured type
|
- `default` - Fallback for any unconfigured type
|
||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -17,6 +17,10 @@ SUBREDDIT = os.getenv("SUBREDDIT", "YOUR_SUBREDDIT")
|
|||||||
release_types_env = os.getenv("RELEASE_TYPES", "release")
|
release_types_env = os.getenv("RELEASE_TYPES", "release")
|
||||||
RELEASE_TYPES = [t.strip() for t in release_types_env.split(",")]
|
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
|
# Post templates
|
||||||
# NOTE: Post titles and bodies are now fetched from the subreddit wiki page "minecraft_update_bot"
|
# 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
|
# See DOCKER.md or README.md for how to set up the wiki page with YAML configuration
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import threading
|
|||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
import config
|
import config
|
||||||
from minecraft_checker import get_latest_releases, parse_release_date
|
from minecraft_checker import get_latest_releases, parse_release_date
|
||||||
|
from bedrock_checker import get_latest_bedrock_release
|
||||||
from wiki_config import WikiConfig
|
from wiki_config import WikiConfig
|
||||||
from update_checker import start_update_checker
|
from update_checker import start_update_checker
|
||||||
|
|
||||||
@@ -112,24 +113,38 @@ def post_to_subreddit(reddit, version_info):
|
|||||||
|
|
||||||
def check_for_updates(reddit):
|
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:
|
Args:
|
||||||
reddit: PRAW Reddit instance
|
reddit: PRAW Reddit instance
|
||||||
"""
|
"""
|
||||||
try:
|
try:
|
||||||
posted_versions = load_posted_versions()
|
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"]
|
version_id = version_info["id"]
|
||||||
|
|
||||||
if version_id not in posted_versions:
|
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):
|
if post_to_subreddit(reddit, version_info):
|
||||||
save_posted_version(version_id)
|
save_posted_version(version_id)
|
||||||
else:
|
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:
|
except Exception as e:
|
||||||
print(f"[BOT] ✗ Error checking for updates: {e}")
|
print(f"[BOT] ✗ Error checking for updates: {e}")
|
||||||
|
|||||||
Reference in New Issue
Block a user