#!/bin/bash
# LGSM fn_versioncheck function
# Author: Daniel Gibbs
# Website: http://danielgibbs.co.uk
# Version: 231214

fn_steamcmdcheck(){
# Checks for server update from SteamCMD
fn_printdots "Checking ${servicename}: Checking for updates via SteamCMD"
installedversion=$(grep buildid "${appmanifestfile}" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\  -f3)
availableversion=$(steamcmd/steamcmd.sh +login "${steamuser}" "${steampass}" +app_info_print ${appid} +app_info_print ${appid} +quit | grep -EA 1000 "^\s+\"branches\"$" | grep -EA 5 "^\s+\"public\"$" | grep -m 1 -EB 10 "^\s+}$" | grep -E "^\s+\"buildid\"\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\  -f3)
sleep 1
if [ -z "${availableversion}" ]; then
	fn_printfail "Checking ${servicename}: Checking for updates via SteamCMD"
	sleep 1
	fn_printfail "Checking ${servicename}: SteamCMD is not returning version info"
	sleep 2
else
	fn_printok "Checking ${servicename}: Checking for updates via SteamCMD"
	sleep 1
fi

if [ -z "${availableversion}" ]; then
	# Checks for server update from SteamDB.info if SteamCMD fails
	echo ""
	fn_printdots "Checking ${servicename}: Checking for updates via SteamDB.info"
	availableversion=$(wget -qO- "http://steamdb.info/api/GetRawDepots/?appid=${appid}" | sed 's/\\n/\n/g' | grep -EA 1000 "^\s+\[branches\]" | grep -EA 5 "^\s+\[public\]" | grep -m 1 -EB 10 "^\s+\)$" | grep -E "^\s+\[buildid\]\s+" | tr '[:blank:]"' ' ' | tr -s ' ' | cut -d\  -f4)
	sleep 1
	if [ -z "${availableversion}" ]; then
		fn_printfail "Checking ${servicename}: Checking for updates via SteamDB.info"
		sleep 1
		fn_printfail "Checking ${servicename}: SteamDB.info is not returning version info"
		sleep 2
	else
		fn_printok "Checking ${servicename}: Checking for updates via SteamDB.info"
		sleep 1
	fi
fi
if [ -z "${availableversion}" ]; then
	fn_logupdaterequest
fi

if [ "${installedversion}" -ne "${availableversion}" ]; then
	echo -e "\n"
	echo -e "Update available:"
	sleep 1
	echo -e "	Installed version: \e[0;31m${installedversion}\e[0;39m"
	echo -e "	Available version: \e[0;32m${availableversion}\e[0;39m"
	echo -e ""
	echo -e "	https://steamdb.info/app/${appid}/"
	sleep 1
	echo ""
	echo -ne "Applying update.\r"
	sleep 1
	echo -ne "Applying update..\r"
	sleep 1
	echo -ne "Applying update...\r"
	sleep 1
	echo -ne "\n"
	if [ ! -z "${norestart}" ]; then
		fn_updateserver
	else
		fn_stopserver
		fn_updateserver
		fn_startserver
	fi
else
	echo -e "\n"
	echo -e "No update available:"
	echo -e "	Installed version: \e[0;32m${installedversion}\e[0;39m"
	echo -e "	Available version: \e[0;32m${availableversion}\e[0;39m"
	echo -e "	https://steamdb.info/app/${appid}/"
	echo -e ""
fi
}

fn_logupdaterequest(){
# Checks for server update requiests from server logs.
echo ""
fn_printdots "Checking ${servicename}: Checking server logs for update requests"
requestrestart=$(grep -sc "MasterRequestRestart" "${consolelog}")
sleep 1
if [ "${requestrestart}" -ge "1" ]; then
	fn_printok "Checking ${servicename}: Checking server logs for update requests"
	sleep 1
	fn_printoknl "Checking ${servicename}: Server requesting update"
	sleep 1
	echo ""
	echo -ne "Applying update.\r"
	sleep 1
	echo -ne "Applying update..\r"
	sleep 1
	echo -ne "Applying update...\r"
	sleep 1
	echo -ne "\n"
	if [ ! -z "${norestart}" ]; then
		fn_updateserver
	else
		fn_stopserver
		fn_updateserver
		fn_startserver
	fi
else
	fn_printok "Checking ${servicename}: Checking logs for update requests"
	sleep 1
	fn_printok "Checking ${servicename}: No update request detected"
	sleep 1
fi
echo ""
exit
}


fn_appmanifestinfo(){
	appmanifestfile=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf")
	appmanifestfilewc=$(find "${filesdir}" -type f -name "appmanifest_${appid}.acf"|wc -l)
}

fn_appmanifestcheck(){
fn_appmanifestinfo
# Multiple or no matching appmanifest files may sometimes be available.
# This is an error is corrected below if required.
if [ "${appmanifestfilewc}" -ge "2" ]; then
	sleep 1
	fn_printwarn "Checking ${servicename}: Multiple appmanifest_${appid}.acf files found"
	sleep 2
	fn_printdots "Checking ${servicename}: Removing x${appmanifestfilewc} appmanifest_${appid}.acf files"
	sleep 1
	for appfile in ${appmanifestfile}; do
		rm "${appfile}"
	done
	appmanifestfilewc1="${appmanifestfilewc}"
	fn_appmanifestinfo
	if [ "${appmanifestfilewc}" -ge "2" ]; then
		fn_printfail "Checking ${servicename}: Unable to remove x${appmanifestfilewc} appmanifest_${appid}.acf files"
		sleep 1
		echo ""
		echo "	Check user permissions"
		for appfile in ${appmanifestfile}; do
			echo "	${appfile}"
		done
		exit
	else
		sleep 1
		fn_printok "Checking ${servicename}: Removed x${appmanifestfilewc1} appmanifest_${appid}.acf files"
		sleep 1
		fn_printinfonl "Checking ${servicename}: Forcing update to correct issue"
		sleep 1
		fn_updateserver
		fn_versioncheck
	fi
elif [ "${appmanifestfilewc}" -eq "0" ]; then
	fn_printwarn "Checking ${servicename}: No appmanifest_${appid}.acf found"
	sleep 2
	fn_printinfonl "Checking ${servicename}: Forcing update to correct issue"
	sleep 1
	fn_updateserver
	fn_logupdaterequest
fi
}

fn_printdots "Checking ${servicename}: Checking for updates"
fn_appmanifestcheck
fn_steamcmdcheck