projects-jenz/AutismBotIngame/python/ingamefollowct.py

225 lines
9.3 KiB
Python
Raw Normal View History

#!/home/autismbot1/ze_runner/venv/bin/python3
2020-01-23 23:15:26 +01:00
import os
import sys
2020-01-23 23:15:26 +01:00
import subprocess
import atexit
2020-01-26 02:29:34 +01:00
from threading import Timer
2020-01-23 23:15:26 +01:00
import string
import random
import signal
import socket
import codecs
import json
import datetime
import time
2020-01-23 23:15:26 +01:00
whoami = subprocess.getoutput(["whoami"])
with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile:
data_ports = json.load(jsonfile)
looptestPath = f"/home/{whoami}/.var/app/com.valvesoftware.Steam/data/Steam/steamapps/common/Counter-Strike Source/cstrike/cfg/looptest.cfg"
chatmsg = ""
2020-09-20 20:19:07 +02:00
def writeCfgInput(Input_user):
with open(looptestPath, 'w') as f:
2020-09-20 20:19:07 +02:00
f.write(Input_user)
time.sleep(0.1)
open(looptestPath, 'w').close()
2020-01-23 23:15:26 +01:00
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")
2020-01-26 02:29:34 +01:00
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)
2023-01-19 17:46:02 +01:00
#request by bane that bots should simply not infect people shrug
2023-01-30 13:12:48 +01:00
strInput = "-attack; wait 2; -use; wait 5; -attack; wait 5; cl_minmodels 1; wait 2; +use; wait 5; "
2023-01-30 14:20:55 +01:00
if targeteam == 3:
2023-01-19 17:46:02 +01:00
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;"
2023-01-30 14:20:55 +01:00
print('dist_target: ', dist_target, ' enemy distance: ', enemy_distance, ' targeteam: ', targeteam, ' state:', state)
if state not in [0, 2, 5, 7, 8]:
strInput = strinput_append(strInput, 2)
#print('strInput final:', strInput)
writeCfgInput(strInput)
2020-01-23 23:15:26 +01:00
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(90)
#we sleep here to wait for .bashrc to launch steam. It takes some time
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')
2020-01-23 23:15:26 +01:00
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;
#deleting maps
subprocess.getoutput([f"rm '/home/{whoami}/.var/app/com.valvesoftware.Steam/data/Steam/steamapps/common/Counter-Strike Source/cstrike/download/maps/'*"])
#deleting POSIX shared memory objects, as long as one process has them open they exist. so probably until steam gets turned off. THis is to prevent /dev/shm from being full
subprocess.getoutput([f"rm /dev/shm/u1001-Shm_*"])
subprocess.getoutput([f"rm /dev/shm/u1002-Shm_*"])
restart_sdl_and_steam()
is_bot_connected_to_ze2 = False
print('preparing to launch game....')
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']:
2021-06-17 18:36:23 +02:00
continue
2021-10-17 17:17:34 +02:00
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)
2021-10-17 15:00:04 +02:00
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)
2020-10-02 19:05:48 +02:00
elif data.startswith("hull info:"):
hull_info = data[data.index("hull info:") + len("hull info:"):]
strInput = ""
2020-10-02 19:05:48 +02:00
if hull_info == "jump":
strInput += "+jump; wait 5; -jump; +duck; wait 50; -duck; wait 5; "
elif hull_info == "crouch":
2020-10-02 22:42:53 +02:00
strInput += "+duck; wait 50; -duck; wait 5; "
writeCfgInput(strInput)
finally:
sock.close()