updated bot version
This commit is contained in:
@@ -0,0 +1 @@
|
||||
1773261500.1906805
|
||||
@@ -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
|
||||
@@ -8,6 +8,7 @@ RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY bot.py .
|
||||
COPY config.py .
|
||||
COPY update_checker.py .
|
||||
# Create DB directory
|
||||
RUN mkdir -p /app/DB
|
||||
|
||||
|
||||
@@ -6,12 +6,18 @@ import time
|
||||
import os
|
||||
import threading
|
||||
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_SECRET = os.environ.get('REDDIT_CLIENT_SECRET')
|
||||
REDDIT_USERNAME = os.environ.get('REDDIT_USERNAME')
|
||||
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')
|
||||
WIKI_PAGE = os.environ.get('WIKI_PAGE', 'testpostsbot_config')
|
||||
@@ -180,6 +186,10 @@ def main():
|
||||
chat_thread.start()
|
||||
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
|
||||
try:
|
||||
while True:
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
praw
|
||||
PyYAML
|
||||
requests
|
||||
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user