#!/home/autismbot1/ze_runner/venv/bin/python3 import os import sys import subprocess import atexit from threading import Timer import string import random import signal import socket import codecs import json import datetime import time whoami = subprocess.getoutput(["whoami"]) with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile: data_ports = json.load(jsonfile) looptestPath = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/cfg/looptest.cfg" chatmsg = "" def writeCfgInput(Input_user): with open(looptestPath, 'w') as f: f.write(Input_user) time.sleep(0.1) open(looptestPath, 'w').close() def exit_handler(): print('reached exithandler') writeCfgInput('') #securing the looptest.cfg wont be stuck accidently with commands kill_owned_process("pidof hl2_linux") kill_owned_process("pidof xterm") def bot_process_movement(input_line): dist_target = input_line[input_line.index("dist_target:") + len("dist_target:"):input_line.index("enemy_distance")] enemy_distance = input_line[input_line.index("enemy_distance:") + len("enemy_distance:"):input_line.index("targeteam:")] targeteam = input_line[input_line.index("targeteam:") + len("targeteam:"):input_line.index("state:")] state = input_line[input_line.index("state:") + len("state:"):] state = int(state.strip()) dist_target = float(dist_target) enemy_distance = float(enemy_distance) targeteam = int(targeteam) #request by bane that bots should simply not infect people shrug if targeteam == 2: strInput = "-attack; wait 2; -use; wait 5; wait 5; cl_minmodels 1; wait 2; +use; wait 5; " else: strInput = "-attack; wait 2; -use; wait 5; +attack; wait 5; cl_minmodels 1; wait 2; +use; wait 5; " #python has no switches and such if state in [5, 7]: strInput += "-forward; wait 2; use weapon_knife; wait 5;" elif state >= 3: strInput += "use weapon_knife; wait 5; +forward; wait 2;" elif state == 0: strInput += "use weapon_p90; wait 2; -forward; wait 2;" elif state == 1: strInput += "wait 2; use weapon_elite; wait 3; +forward; wait 2;" elif state == 2: strInput += "-forward; wait 2; use weapon_elite; wait 3;" elif state == 8: strInput += "use weapon_knife; wait 5; +forward; wait 2;" print('dist_target: ', dist_target, ' enemy distance: ', enemy_distance, ' targetteam: ', targeteam, ' state:', state) if state not in [0, 2, 5, 7, 8]: strInput = strinput_append(strInput, 2) #print('strInput final:', strInput) writeCfgInput(strInput) def strinput_append(strInput, nth): for _ in range(3 * nth): boolean_val = random.choice([True, False]) if boolean_val: strInput += " +moveleft; wait 15; -moveleft; " else: strInput += " +moveright; wait 15; -moveright; " return strInput def kill_user_owned_pid(pid): print('pid: ', pid, ' killed') pid = int(pid.strip()) os.kill(pid, signal.SIGKILL) time.sleep(10) def return_user_owned_pid(pidof): owner_pid = subprocess.getoutput([f"{pidof}"]) if owner_pid: for pid in owner_pid.split(" "): username = subprocess.getoutput([f"""ps -o user= -p {pid}"""]) if username == whoami: return pid return None def kill_owned_process(pidof): pid = return_user_owned_pid(pidof) while pid: kill_user_owned_pid(pid) pid = return_user_owned_pid(pidof) def restart_sdl_and_steam(): #subprocess.getoutput(["screen -XS XTERM quit"]) kill_owned_process("pidof hl2_linux") kill_owned_process("pidof xterm") x2go_session_list = subprocess.getoutput(["x2golistsessions"]) print('x2golistsessions: ', x2go_session_list) if not x2go_session_list: print('no session. creating Display to make idle session') subprocess.getoutput([f"screen -d -m -S pyhoca_display ./run_follow.sh"]) while not x2go_session_list or len(x2go_session_list.split('|')[0].replace(" ", "")) == 0: time.sleep(5) x2go_session_list = subprocess.getoutput(["x2golistsessions"]) print(f'finally found x2go_session_list: {x2go_session_list}') hostname = subprocess.getoutput(['hostname']) x2go_session_display = x2go_session_list.split(f'|{hostname}')[0].rsplit('|', 1)[1] x2go_session_pid = x2go_session_list.split('|')[0] x2go_session_id = x2go_session_list.split('|')[1].split('|')[0] x2go_session_command = 'TERMINAL xterm' xterm_cmd = f'screen -d -m -S XTERM x2goruncommand {x2go_session_display} {x2go_session_pid} {x2go_session_id} {x2go_session_command}' print(f'xterm_cmd: {xterm_cmd}') subprocess.getoutput([xterm_cmd]) print('reached .bashrc executing steam and variables') time.sleep(60) #we sleep here to wait for .bashrc to launch steam. It takes some time def launch_css_process(): print('preparing to launch game....') #deleting maps subprocess.getoutput([f"rm '/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download/maps/'*"]) #launching game subprocess.getoutput([f"/home/{whoami}/.steam/debian-installation/steam.sh -applaunch 240 -textmode -novid -nosound -noipx -nojoy -noshaderapi -port {data_ports['steam_port']}"]) print('finished starting game') def bot_connect(data): #use whatever ip you want here to connect with str1 = "" if "connect to ze" == data: str1 = f"connect {data_ports['server_ip_port_ze']}" elif "connect to ze2" == data: str1 = f"connect {data_ports['server_ip_port_ze2']}" writeCfgInput(str1) time.sleep(0.5) writeCfgInput("") print('not yet connected') if __name__ == '__main__': atexit.register(exit_handler) local_port = data_ports['udp_port'] external_port_messages = data_ports['chat_external_port'] buffer_size = 4096 #potentially not large enough? connection_issue_counter = 0; pid = return_user_owned_pid("pidof hl2_linux") if not pid: restart_sdl_and_steam() else: kill_owned_process("pidof hl2_linux") is_bot_connected_to_ze2 = False launch_css_process() sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(("", local_port)) sock.settimeout(5.0) messager_name = "" try: while True: try: data, addr = sock.recvfrom(buffer_size) except socket.timeout: continue data = codecs.decode(data, "utf-8", "ignore") ip = addr[0] port = addr[1] #print('port: ', port, " ip: ", ip) #print('data: ', data) if not data: continue if ip == data_ports['discord_bot_ip'] and port == external_port_messages: if messager_name in data: messager_name = "" response_msg = f"""say {messager_name} {data}""" print("remote UDP packet response_msg: ", response_msg) writeCfgInput(response_msg) if ip != data_ports['ovh_ip']: continue elif data == "rtv": response_msg = "say rtv" writeCfgInput(response_msg) elif data == "bot kicked server full": print('bot kicked server full: ', datetime.datetime.now().time()) elif "autismo connected to ze" == data: print('Bot connected to ze!') connection_issue_counter = 0 is_bot_connected_to_ze2 = False elif "not connected to ze2" == data: is_bot_connected_to_ze2 = False elif "autismo connected to ze2" == data: print('Bot connected to ze2!') connection_issue_counter = 0 is_bot_connected_to_ze2 = True elif "connect to ze" == data or ("connect to ze2" == data and not is_bot_connected_to_ze2): if connection_issue_counter == 20: kill_owned_process("pidof hl2_linux") print('exiting') sys.exit(1) else: print('data: ', data) connection_issue_counter += 1 print('connection_issue_counter: ', connection_issue_counter) bot_connect(data) elif "clientmessage:" in data: messager_name = data.split("clientmessage:", 1)[1].split(" 72DqZ84")[0] databyte_send_message = messager_name + data.split("72DqZ84")[1] sock.sendto(databyte_send_message.encode(), (data_ports["discord_bot_ip"], external_port_messages)) print('databyte_send_message: ', databyte_send_message) elif data.startswith("dist_target:"): bot_process_movement(data) elif data.startswith("surfing:"): bot_process_surf(data) elif data.startswith("hull info:"): hull_info = data[data.index("hull info:") + len("hull info:"):] strInput = "" if hull_info == "jump": strInput += "+jump; wait 5; -jump; +duck; wait 50; -duck; wait 5; " elif hull_info == "crouch": strInput += "+duck; wait 50; -duck; wait 5; " writeCfgInput(strInput) finally: sock.close() #/home/gameservers/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/cfg/autoexec.cfg: #alias loop "exec looptest.cfg; wait 5; loop;"; wait 5; loop; #create looptest.cfg in /cfg/ folder #X2GO_NXAGENT_DEFAULT_OPTIONS="-options nx/nx,sleep=0" /etc/x2go/x2goagent.options #keeps session as R instead of S which is needed for interaction with graphical components such as steam and CS:S """ .bashrc requires: if [[ $DISPLAY ]]; then echo 'SDL_VIDEO_X11_VISUALID: ' $SDL_VIDEO_X11_VISUALID export SDL_VIDEO_X11_VISUALID=0x205 echo 'SDL_VIDEO_X11_VISUALID: ' $SDL_VIDEO_X11_VISUALID steam -no-browser fi """ #screen -d -m -S ze_runner python3 ingamefollowct.py