2025-06-20 23:48:10 +02:00
import requests
2025-06-21 00:01:33 +02:00
import subprocess
2025-06-21 00:14:01 +02:00
import sys
2025-07-09 15:05:06 +02:00
import logging
2025-07-15 23:56:44 +02:00
import json
2025-07-16 00:32:59 +02:00
import time
import random
2025-07-22 19:32:19 +03:00
import modules . keys as k
from modules . globalvars import *
from modules . settings import Settings as SettingsManager
settings_manager = SettingsManager ( )
settings = settings_manager . settings
2025-07-09 15:05:06 +02:00
logger = logging . getLogger ( " goober " )
2025-07-07 01:18:51 +02:00
launched = False
2025-06-22 19:07:41 +02:00
# Run a shell command and return its output
2025-06-21 00:01:33 +02:00
def run_cmd ( cmd ) :
result = subprocess . run ( cmd , shell = True , capture_output = True , text = True )
return result . stdout . strip ( )
2025-06-22 19:07:41 +02:00
# Check if the remote branch is ahead of the local branch
2025-06-21 00:01:33 +02:00
def is_remote_ahead ( branch = ' main ' , remote = ' origin ' ) :
run_cmd ( f ' git fetch { remote } ' )
count = run_cmd ( f ' git rev-list --count HEAD.. { remote } / { branch } ' )
return int ( count ) > 0
2025-06-22 19:07:41 +02:00
# Automatically update the local repository if the remote is ahead
2025-06-21 00:01:33 +02:00
def auto_update ( branch = ' main ' , remote = ' origin ' ) :
2025-06-29 19:44:56 +02:00
if launched == True :
2025-07-22 19:32:19 +03:00
print ( k . already_started ( ) )
2025-06-29 19:44:56 +02:00
return
2025-07-22 19:32:19 +03:00
if settings [ " auto_update " ] != " True " :
2025-06-22 19:07:41 +02:00
pass # Auto-update is disabled
2025-06-21 00:01:33 +02:00
if is_remote_ahead ( branch , remote ) :
2025-07-22 19:32:19 +03:00
logger . info ( k . remote_ahead ( remote , branch ) )
2025-06-21 00:01:33 +02:00
pull_result = run_cmd ( f ' git pull { remote } { branch } ' )
2025-07-09 15:05:06 +02:00
logger . info ( pull_result )
2025-07-22 19:32:19 +03:00
logger . info ( k . please_restart ( ) )
2025-06-21 00:14:01 +02:00
sys . exit ( 0 )
2025-06-21 00:01:33 +02:00
else :
2025-07-22 19:32:19 +03:00
logger . info ( k . local_ahead ( remote , branch ) )
2025-06-20 23:48:10 +02:00
def get_latest_version_info ( ) :
try :
2025-07-16 00:32:59 +02:00
unique_suffix = f " { int ( time . time ( ) ) } _ { random . randint ( 0 , 9999 ) } "
url = f " { UPDATE_URL } ?_= { unique_suffix } "
curl_cmd = [
" curl " ,
" -s " ,
" -H " , " Cache-Control: no-cache " ,
" -H " , " Pragma: no-cache " ,
url
]
result = subprocess . run ( curl_cmd , capture_output = True , text = True , timeout = 5 )
content = result . stdout
if result . returncode != 0 :
logger . error ( f " curl failed with return code { result . returncode } " )
return None
try :
data = json . loads ( content )
return data
except json . JSONDecodeError :
logger . error ( " JSON decode failed " )
2025-07-16 00:33:14 +02:00
logger . error ( content [ : 500 ] )
2025-06-20 23:48:10 +02:00
return None
2025-07-16 00:32:59 +02:00
except Exception as e :
logger . error ( f " Exception in get_latest_version_info: { e } " )
2025-06-20 23:48:10 +02:00
return None
2025-06-22 19:07:41 +02:00
# Check if an update is available and perform update if needed
2025-07-16 14:39:18 +02:00
def check_for_update ( ) :
2025-07-07 01:18:51 +02:00
global latest_version , local_version , launched
2025-06-22 19:07:41 +02:00
2025-06-20 23:48:10 +02:00
latest_version_info = get_latest_version_info ( )
if not latest_version_info :
2025-07-22 19:32:19 +03:00
logger . error ( f " { k . fetch_update_fail ( ) } " )
return None
2025-06-20 23:48:10 +02:00
latest_version = latest_version_info . get ( " version " )
os . environ [ ' gooberlatest_version ' ] = latest_version
download_url = latest_version_info . get ( " download_url " )
if not latest_version or not download_url :
2025-07-22 19:32:19 +03:00
logger . error ( k . invalid_server ( ) )
return None
2025-06-22 19:07:41 +02:00
# Check if local_version is valid
2025-06-20 23:48:10 +02:00
if local_version == " 0.0.0 " or None :
2025-07-22 19:32:19 +03:00
logger . error ( k . cant_find_local_version ( ) )
2025-06-20 23:48:10 +02:00
return
2025-06-22 19:07:41 +02:00
# Compare local and latest versions
2025-07-22 19:32:19 +03:00
2025-06-20 23:48:10 +02:00
if local_version < latest_version :
2025-07-22 19:32:19 +03:00
logger . warning ( k . new_version ( latest_version = latest_version , local_version = local_version ) )
logger . warning ( k . changelog ( VERSION_URL = VERSION_URL ) )
2025-06-21 00:01:33 +02:00
auto_update ( )
2025-07-22 19:32:19 +03:00
2025-07-07 13:05:50 +02:00
elif beta == True :
2025-07-16 00:32:59 +02:00
logger . warning ( f " You are running an \" unstable \" version of Goober, do not expect it to work properly. \n Version { local_version } \n Server: { latest_version } { RESET } " )
2025-07-06 21:06:04 +02:00
elif local_version > latest_version :
2025-07-22 19:32:19 +03:00
logger . warning ( f " { k . modification_warning ( ) } " )
2025-06-20 23:48:10 +02:00
elif local_version == latest_version :
2025-07-22 19:32:19 +03:00
logger . info ( f " { k . latest_version ( ) } { local_version } " )
logger . info ( f " { k . latest_version2 ( VERSION_URL = VERSION_URL ) } \n \n " )
2025-07-07 01:18:51 +02:00
launched = True
2025-06-23 13:56:23 +02:00
return latest_version