from flask import Flask, render_template, send_from_directory import schedule import threading import time import subprocess import os import shutil import stat import logging # ロギング設定 logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s") # 定数 REPO_URL = "https://github.com/SharkPool-SP/SharkPools-Extensions.git" REPO_DIR = "SharkPools-Extensions" TARGET_FILE = os.path.join(REPO_DIR, "pages", "startup.js") # Flask アプリケーション設定 app = Flask(__name__, template_folder="templates", static_folder="static") @app.route("/") def index(): return render_template("index.html") @app.route('/') def serve_static(filename): return send_from_directory(app.static_folder, filename) # 読み取り専用ファイルを削除できるようにする def remove_readonly(func, path, excinfo): os.chmod(path, stat.S_IWRITE) func(path) def clone_or_update_repo(): logging.info("リポジトリの更新を開始します。") if not os.path.exists(REPO_DIR): logging.info("リポジトリをクローン中...") subprocess.run(["git", "clone", REPO_URL]) else: logging.info("リポジトリをプル中...") result = subprocess.run(["git", "-C", REPO_DIR, "pull"], capture_output=True, text=True) logging.info(result.stdout) if result.stderr: logging.error(result.stderr) src_target_file = os.path.join(REPO_DIR, "pages", "startup.js") dest_pages = os.path.join("static", "pages") if not os.path.exists(src_target_file): logging.warning(f"{src_target_file} が存在しません。") else: if os.path.exists(dest_pages): shutil.rmtree(dest_pages, onerror=remove_readonly) shutil.copytree(os.path.join(REPO_DIR, "pages"), dest_pages) target_file_copy = os.path.join(dest_pages, "startup.js") with open(target_file_copy, "r", encoding="utf-8") as f: content = f.read() logging.info(f"コピー後のstartup.jsの内容抜粋:\n{content[:200]}") logging.info("startup.js を修正中...") new_content = content.replace( '}, "https://studio.penguinmod.com");', '}, "*");' ) if content == new_content: logging.warning("置換対象の文字列が見つかりませんでした。") else: with open(target_file_copy, "w", encoding="utf-8") as f: f.write(new_content) logging.info("置換が完了しました。") # index.html をコピー os.makedirs("templates", exist_ok=True) shutil.copy(os.path.join(REPO_DIR, "index.html"), "templates/index.html") # ここで を削除 index_path = os.path.join("templates", "index.html") with open(index_path, "r", encoding="utf-8") as f: html = f.read() import re # を削除 new_html = re.sub(r'', '', html, flags=re.IGNORECASE) if html == new_html: logging.warning(" タグが見つかりませんでした。") else: with open(index_path, "w", encoding="utf-8") as f: f.write(new_html) logging.info(" タグの削除が完了しました。") logging.info("リポジトリの更新が完了しました。") # スケジューラを実行する関数(1分ごと) def run_scheduler(): schedule.every(60).minutes.do(clone_or_update_repo) try: while True: schedule.run_pending() time.sleep(1) except Exception as e: logging.error(f"スケジューラでエラーが発生しました: {e}") # 初回実行およびスケジューラ起動 clone_or_update_repo() scheduler_thread = threading.Thread(target=run_scheduler, daemon=True) scheduler_thread.start() # アプリ起動 if __name__ == "__main__": app.run(debug=True, host="0.0.0.0", port=7860)