updated bot version

This commit is contained in:
2026-03-11 20:51:11 +00:00
parent b9ddeb5303
commit ffaae146ac
6 changed files with 222 additions and 1 deletions
+1
View File
@@ -0,0 +1 @@
1773261500.1906805
+103
View File
@@ -0,0 +1,103 @@
o9q8xhp
o9q9ibz
o9q9jvz
o9q9pcn
o9qawn5
o9qayrb
o9qb2tq
o9qdm6v
o9qdpsi
o9qdzec
o9qef38
o9qff1w
o9qfgmz
o9qfyl7
o9qgkgs
o9qh4nu
o9qh5uk
o9qhh0b
o9qiha2
o9qikd8
o9qijyj
o9qj7de
o9qja83
o9qjbc5
o9qkdi6
o9qkfdj
o9qkjp9
o9qm2qu
o9qm3gf
o9qm94g
o9qmr6t
o9qmt9p
o9qmylo
o9qnrak
o9qnsm6
o9qo16b
o9qot2n
o9qou0k
o9qp1vq
o9qpkrh
o9qpm3p
o9qpuks
o9qqe50
o9qqfrd
o9qr1ee
o9qrb06
o9qrcv4
o9qs54o
o9qs6i6
o9qsbua
o9qst9s
o9qvs45
o9qwlty
o9qxih7
o9qxjm9
o9qzqpn
o9qzsej
o9qzzma
o9r00bc
o9r093d
o9r111o
o9r6uje
o9r6w0g
o9r7s7b
o9r8j1q
o9r8k85
o9r8qtp
o9r9gzr
o9r9iud
o9r9vwe
o9r9xlc
o9raamy
o9raaid
o9racr4
o9raepg
o9rbepq
o9rd2ve
o9rd34l
o9rd3dx
o9rd3q8
o9rd44n
o9rd5ai
o9rd5ef
o9rd5n2
o9rd5i6
o9rd5vt
o9rd60r
o9rd5rs
o9rdgs4
o9rdqyg
5k3eari
5k3j00u
5k3nm4r
5k3p083
5k3pd9q
5k3pqsx
o9vy9h2
o9wez6a
o9wf1nr
o9wf3as
o9x1j7v
o9x1lp2
o9x1n77
+1
View File
@@ -8,6 +8,7 @@ RUN pip install --no-cache-dir -r requirements.txt
COPY bot.py . COPY bot.py .
COPY config.py . COPY config.py .
COPY update_checker.py .
# Create DB directory # Create DB directory
RUN mkdir -p /app/DB RUN mkdir -p /app/DB
+11 -1
View File
@@ -6,12 +6,18 @@ import time
import os import os
import threading import threading
from config import fetch_config_from_wiki, validate_config_from_wiki, get_trigger_posts from config import fetch_config_from_wiki, validate_config_from_wiki, get_trigger_posts
from update_checker import start_update_checker
# ==================== VERSION ====================
BOT_VERSION = "1.0.0"
BOT_NAME = "TestPostsBot"
# ==================================================
REDDIT_CLIENT_ID = os.environ.get('REDDIT_CLIENT_ID') REDDIT_CLIENT_ID = os.environ.get('REDDIT_CLIENT_ID')
REDDIT_CLIENT_SECRET = os.environ.get('REDDIT_CLIENT_SECRET') REDDIT_CLIENT_SECRET = os.environ.get('REDDIT_CLIENT_SECRET')
REDDIT_USERNAME = os.environ.get('REDDIT_USERNAME') REDDIT_USERNAME = os.environ.get('REDDIT_USERNAME')
REDDIT_PASSWORD = os.environ.get('REDDIT_PASSWORD') REDDIT_PASSWORD = os.environ.get('REDDIT_PASSWORD')
REDDIT_USER_AGENT = os.environ.get('REDDIT_USER_AGENT', f'TestPostsBot/0.1 on {REDDIT_USERNAME}') REDDIT_USER_AGENT = os.environ.get('REDDIT_USER_AGENT', f'{BOT_NAME}/{BOT_VERSION} on {REDDIT_USERNAME}')
SUBREDDIT = os.environ.get('SUBREDDIT') SUBREDDIT = os.environ.get('SUBREDDIT')
WIKI_PAGE = os.environ.get('WIKI_PAGE', 'testpostsbot_config') WIKI_PAGE = os.environ.get('WIKI_PAGE', 'testpostsbot_config')
@@ -180,6 +186,10 @@ def main():
chat_thread.start() chat_thread.start()
print("[STARTUP] Chat message watcher started.") print("[STARTUP] Chat message watcher started.")
# Start update checker in background thread
start_update_checker(reddit, SUBREDDIT, BOT_NAME, BOT_VERSION)
print("[STARTUP] Update checker started.")
# Keep main thread alive # Keep main thread alive
try: try:
while True: while True:
+1
View File
@@ -1,2 +1,3 @@
praw praw
PyYAML PyYAML
requests
+105
View File
@@ -0,0 +1,105 @@
import requests
import threading
import time
import os
from datetime import datetime
UPDATE_CHECK_INTERVAL = 60 # Check every minute
UPDATE_COOLDOWN = 86400 # Don't send mail more than once per 24 hours
LAST_UPDATE_FILE = os.path.join(os.path.dirname(__file__), 'DB', '.last_update_check.txt')
def get_latest_version(bot_name):
"""Fetch latest version info from update server."""
try:
response = requests.get(f'https://updts.slfhstd.uk/api/version/{bot_name}', timeout=10)
if response.status_code == 200:
return response.json()
except Exception as e:
print(f"[UPDATE_CHECKER] Error fetching version: {e}")
return None
def send_update_modmail(reddit, subreddit_name, bot_name, current_version, available_version, changelog_url):
"""Send modmail to subreddit modteam about available update."""
try:
subject = f"🤖 {bot_name} Update Available (v{available_version})"
message = f"""Hello,
An update is available for {bot_name}!
**Current Version:** {current_version}
**Available Version:** {available_version}
Changelog: {changelog_url}
Please visit the update server for installation instructions.
---
This is an automated message from the Update Checker."""
# Build payload for the compose API
data = {
"subject": subject,
"text": message,
"to": f"/r/{subreddit_name}",
}
reddit.post("api/compose/", data=data)
print(f"[UPDATE_CHECKER] Sent update notification to r/{subreddit_name}")
return True
except Exception as e:
print(f"[UPDATE_CHECKER] Error sending modmail: {e}")
return False
def should_send_update_mail():
"""Check if enough time has passed since last update mail."""
if not os.path.exists(LAST_UPDATE_FILE):
return True
try:
with open(LAST_UPDATE_FILE, 'r') as f:
last_check = float(f.read().strip())
return (time.time() - last_check) >= UPDATE_COOLDOWN
except:
return True
def mark_update_mailed():
"""Record when update mail was sent."""
os.makedirs(os.path.dirname(LAST_UPDATE_FILE), exist_ok=True)
with open(LAST_UPDATE_FILE, 'w') as f:
f.write(str(time.time()))
def update_checker_thread(reddit, subreddit_name, bot_name, current_version):
"""Background thread that checks for updates periodically."""
print(f"[UPDATE_CHECKER] Started for {bot_name} v{current_version}")
while True:
try:
version_info = get_latest_version(bot_name)
if version_info:
available_version = version_info.get('version')
changelog_url = version_info.get('changelog_url', '#')
if available_version != current_version and should_send_update_mail():
print(f"[UPDATE_CHECKER] Update found: {current_version} -> {available_version}")
if send_update_modmail(reddit, subreddit_name, bot_name, current_version, available_version, changelog_url):
mark_update_mailed()
except Exception as e:
print(f"[UPDATE_CHECKER] Error in update checker thread: {e}")
time.sleep(UPDATE_CHECK_INTERVAL)
def start_update_checker(reddit, subreddit_name, bot_name, bot_version):
"""Start the update checker in a background thread."""
thread = threading.Thread(
target=update_checker_thread,
args=(reddit, subreddit_name, bot_name, bot_version),
daemon=True
)
thread.start()