first changes so far to handling how autism bots connect and their resource ussage
This commit is contained in:
parent
ba06b94845
commit
de458c3c37
@ -23,7 +23,8 @@
|
||||
|
||||
#probably good idea to symlink the download folder
|
||||
ln -s /home/autismbot1/.steam/debian-installation/steamapps/common/Counter-Strike\ Source/cstrike/download /home/autismbot2/.steam/debian-installation/steamapps/common/Counter-Strike\ Source/cstrike/download
|
||||
chmod g+x /home/user1
|
||||
|
||||
|
||||
|
||||
|
||||
dpkg-reconfigure locales
|
||||
@ -83,3 +84,9 @@ now using tigervnc instead of x2go.
|
||||
vncviewer -SecurityTypes VncAuth,TLSVnc ip:X Display
|
||||
|
||||
for example: vncviewer -SecurityTypes VncAuth,TLSVnc 127.0.0.1:1
|
||||
|
||||
limiting cpu can throttle the download speed as well. if bots cant connect and are missing files, let them try to download stuff with the cpu limiting commented out instead.
|
||||
|
||||
#pip3 extra
|
||||
|
||||
pip3 install watchdog
|
||||
|
@ -3,11 +3,10 @@ import os
|
||||
import sys
|
||||
import subprocess
|
||||
import atexit
|
||||
from threading import Timer
|
||||
import string
|
||||
from watchdog.observers import Observer
|
||||
from watchdog.events import FileSystemEventHandler
|
||||
import random
|
||||
import signal
|
||||
import traceback
|
||||
import socket
|
||||
import codecs
|
||||
import json
|
||||
@ -15,8 +14,8 @@ import datetime
|
||||
import time
|
||||
import glob
|
||||
|
||||
connection_issue_counter = 0;
|
||||
call_bot_connect = True
|
||||
restart_time = datetime.datetime.now() + datetime.timedelta(hours=5)
|
||||
|
||||
whoami = subprocess.getoutput(["whoami"])
|
||||
with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile:
|
||||
@ -24,6 +23,10 @@ with open(f'/home/{whoami}/ze_runner/config.json') as jsonfile:
|
||||
looptestPath = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/cfg/looptest.cfg"
|
||||
chatmsg = ""
|
||||
|
||||
def overwrite_file_access():
|
||||
#setting defaults with setfacl for the download directory does not work seemingly
|
||||
subprocess.Popen(["chmod", "-R", "g+rwx", f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download"], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).communicate()
|
||||
|
||||
def writeCfgInput(Input_user):
|
||||
with open(looptestPath, 'w') as f:
|
||||
f.write(Input_user)
|
||||
@ -37,17 +40,21 @@ def writeCfgInput(Input_user):
|
||||
time.sleep(0.5)
|
||||
open(looptestPath, 'w').close() #clearing file.
|
||||
|
||||
def close_observer(observer):
|
||||
observer.stop()
|
||||
observer.join() #supposedly needed to clear resources again.
|
||||
|
||||
def clean_up_files():
|
||||
#deleting POSIX shared memory objects, as long as one process has them open they exist. THis is to prevent /dev/shm from being full
|
||||
#due to steam child processes.
|
||||
#even with steam turned offline might there be chromium web browsers left over from steam who still hold processes open.
|
||||
#only kind of potential issues from this is steam cloud being out of sync, which is really fucking irrelevant.
|
||||
subprocess.Popen(["rm -rf /tmp/steam*"], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/dbus*"], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/pressure*"], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/tigervnc*"], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/dumps*"], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /dev/shm/u100*"], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/steam*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/dbus*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/pressure*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/tigervnc*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /tmp/dumps*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0]
|
||||
subprocess.Popen(["rm -rf /dev/shm/u100*"], shell=True, stdout=subprocess.DEVNULL).communicate()[0]
|
||||
#users should only have permissions to delete their own files probably
|
||||
|
||||
def exit_handler():
|
||||
@ -104,7 +111,7 @@ def strinput_append(strInput, nth):
|
||||
return strInput
|
||||
|
||||
def kill_user_owned_pid(pid):
|
||||
print('pid: ', pid, ' killed')
|
||||
#print('pid: ', pid, ' killed')
|
||||
pid = int(pid.strip())
|
||||
os.kill(pid, signal.SIGKILL)
|
||||
time.sleep(10)
|
||||
@ -133,11 +140,10 @@ def restart_sdl_and_steam():
|
||||
time.sleep(5)
|
||||
|
||||
cmd = f'vncserver -localhost no -geometry 1x1 -depth 24'
|
||||
#cmd = f'vncserver -localhost no -geometry 800x800 -depth 24'
|
||||
#print(f'cmd: {cmd}')
|
||||
subprocess.getoutput([cmd])
|
||||
print('reached .bashrc executing steam and variables')
|
||||
time.sleep(10)
|
||||
#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
|
||||
@ -149,46 +155,67 @@ def bot_connect(data):
|
||||
writeCfgInput(str1)
|
||||
time.sleep(1)
|
||||
|
||||
handle_bz2_map_files()
|
||||
t = Timer(30, attempt_bot_connect)
|
||||
t.start()
|
||||
|
||||
def cpulimit_pid_of_game():
|
||||
# ' > /dev/null' redirects stdout to /dev/null
|
||||
# '2>&1' redirects stderr to the same place as stdout
|
||||
pid = return_user_owned_pid("pidof cstrike_linux64")
|
||||
cmd = f"cpulimit --pid={pid} --limit=5 --background"
|
||||
#print('the command is: ', cmd)
|
||||
cmd = f"cpulimit --pid={pid} --limit=5 --background > /dev/null 2>&1"
|
||||
subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
|
||||
def delete_lock_file():
|
||||
#just delete the tmp source_engine .lock file here so multiple instances can run at same time.
|
||||
subprocess.Popen(["rm -f /tmp/source_engine*.lock"], shell=True, stdout=subprocess.PIPE).communicate()[0]
|
||||
subprocess.Popen(["rm -f /tmp/source_engine*.lock"], shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL).communicate()[0]
|
||||
|
||||
def attempt_bot_connect():
|
||||
global connection_issue_counter
|
||||
def my_file_created_function(event_path):
|
||||
global call_bot_connect
|
||||
connection_issue_counter += 1
|
||||
call_bot_connect = True
|
||||
print('finished timer callback')
|
||||
call_bot_connect = False
|
||||
|
||||
def handle_bz2_map_files():
|
||||
#if downloading maps we give it 10 seconds delay to see if the size changed, if not its probably safe to delete the .bz2 file as no download in progress
|
||||
bz2_maps = {}
|
||||
#print(f"New file created: {event_path}")
|
||||
if not event_path.lower().endswith(".bsp.bz2"):
|
||||
return
|
||||
|
||||
file_size = None
|
||||
while True:
|
||||
found = False
|
||||
for f in glob.glob(f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download/maps/*.bz2"):
|
||||
found = True
|
||||
fsize = subprocess.Popen(["du", "-sh", f], stdout=subprocess.PIPE).communicate()[0].decode().split("\t")[0]
|
||||
#deleting left over bz2 files because they give missing map issue
|
||||
if f in bz2_maps:
|
||||
#if the size is still the same it should be abandoned bz2 file that we can delete
|
||||
if bz2_maps[f] == fsize:
|
||||
subprocess.Popen(["rm", f], stdout=subprocess.PIPE).communicate()[0]
|
||||
bz2_maps[f] = fsize
|
||||
#no bz2 maps left to be concerned about
|
||||
if not found:
|
||||
break
|
||||
#repeatedly spamming to kill cpu limitting, its bottlenecking the download speed
|
||||
kill_owned_process("pidof cpulimit")
|
||||
time.sleep(10)
|
||||
|
||||
stdout, stderr = subprocess.Popen(["ls", "-l", event_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
|
||||
#print('stdout: ', stdout)
|
||||
#print('stderr: ', stderr)
|
||||
if stderr:
|
||||
print('finished downloading the bz2 file.')
|
||||
break
|
||||
user = stdout.decode().split("autismbots")[0]
|
||||
if whoami not in user:
|
||||
writeCfgInput("disconnect;")
|
||||
print("disconnected from server until other user finished downloading bz2 file")
|
||||
continue
|
||||
|
||||
#in case the bz2 download is not progressing just delete the file and disconnect.
|
||||
cur_file_size = stdout.decode().split("autismbots")[1].strip().split(" ")[0]
|
||||
if file_size == cur_file_size:
|
||||
print("Aborting connection. file download is stuck.")
|
||||
writeCfgInput("disconnect;")
|
||||
break
|
||||
file_size = cur_file_size
|
||||
|
||||
call_bot_connect = True
|
||||
|
||||
class NewFileHandler(FileSystemEventHandler):
|
||||
def on_created(self, event):
|
||||
my_file_created_function(event.src_path)
|
||||
|
||||
def handle_bz2_files():
|
||||
#mostly its just downloading maps that we will be doing
|
||||
root_dir = f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download"
|
||||
event_handler = NewFileHandler()
|
||||
observer = Observer()
|
||||
# Schedule the observer to watch the root directory and its subdirectories recursively
|
||||
observer.schedule(event_handler, root_dir, recursive=True)
|
||||
observer.start()
|
||||
return observer
|
||||
|
||||
if __name__ == '__main__':
|
||||
atexit.register(exit_handler)
|
||||
local_port = data_ports['udp_port']
|
||||
@ -197,10 +224,10 @@ if __name__ == '__main__':
|
||||
|
||||
clean_up_files()
|
||||
delete_lock_file()
|
||||
handle_bz2_map_files()
|
||||
observer = handle_bz2_files()
|
||||
|
||||
maps_folder_size = subprocess.Popen(["du", "-sh", f"/home/{whoami}/.steam/debian-installation/steamapps/common/Counter-Strike Source/cstrike/download/maps"], stdout=subprocess.PIPE).communicate()[0].decode().split("\t")[0]
|
||||
#deleting when maps folder larger than 150GB
|
||||
#deleting when maps folder larger than some GB
|
||||
if maps_folder_size.endswith("G"):
|
||||
maps_folder_size = float(maps_folder_size[:-1])
|
||||
if maps_folder_size > 40.0:
|
||||
@ -217,9 +244,16 @@ if __name__ == '__main__':
|
||||
sock.settimeout(5.0)
|
||||
messager_name = ""
|
||||
|
||||
#limit the cpu allowed to be used by the game instance.
|
||||
time.sleep(11)
|
||||
cpulimit_pid_of_game()
|
||||
#give the game some time to launch
|
||||
fail_safe = 5
|
||||
while return_user_owned_pid("pidof cstrike_linux64") is None:
|
||||
#just a fail safe to prevent being stuck forever.
|
||||
if fail_safe <= 0:
|
||||
sys.exit(1)
|
||||
time.sleep(10)
|
||||
print("launching game...")
|
||||
fail_safe -= 1
|
||||
time.sleep(10)
|
||||
|
||||
try:
|
||||
while True:
|
||||
@ -252,25 +286,32 @@ if __name__ == '__main__':
|
||||
print('bot kicked server full: ', datetime.datetime.now().time())
|
||||
elif "autismo connected to ze" == data:
|
||||
print('Bot connected to ze!')
|
||||
connection_issue_counter = 0
|
||||
cpulimit_pid_of_game()
|
||||
call_bot_connect = True
|
||||
is_bot_connected_to_ze2 = False
|
||||
overwrite_file_access()
|
||||
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
|
||||
cpulimit_pid_of_game()
|
||||
call_bot_connect = True
|
||||
is_bot_connected_to_ze2 = True
|
||||
overwrite_file_access()
|
||||
elif "connect to ze" == data or ("connect to ze2" == data and not is_bot_connected_to_ze2):
|
||||
if connection_issue_counter == 5:
|
||||
if datetime.datetime.now() >= restart_time:
|
||||
kill_owned_process("pidof cstrike_linux64")
|
||||
sock.close()
|
||||
print('exiting')
|
||||
close_observer(observer)
|
||||
print('exiting after running the game for several hours.')
|
||||
sys.exit(1)
|
||||
else:
|
||||
if call_bot_connect:
|
||||
call_bot_connect = False
|
||||
#stop cpu limitting, its bottlenecking the connection to the server.
|
||||
kill_owned_process("pidof cpulimit")
|
||||
|
||||
print('data: ', data)
|
||||
print("connection_issue_counter: ", connection_issue_counter)
|
||||
call_bot_connect = False
|
||||
bot_connect(data)
|
||||
elif "clientmessage:" in data:
|
||||
messager_name = data.split("clientmessage:", 1)[1].split(f" {data_ports['magic_secret']}")[0]
|
||||
@ -291,3 +332,4 @@ if __name__ == '__main__':
|
||||
writeCfgInput(strInput)
|
||||
finally:
|
||||
sock.close()
|
||||
close_observer(observer)
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <cstrike>
|
||||
#include <dhooks>
|
||||
#include <socket>
|
||||
#include <UNLOZE.secret>
|
||||
|
||||
int target_friend_afk_counter[MAXPLAYERS][MAXPLAYERS + 1];
|
||||
int target_friend[MAXPLAYERS + 1];
|
||||
@ -336,7 +337,7 @@ public void cmd_talk_help(int port, int client, char[] info)
|
||||
char msg[generic_length * 5];
|
||||
chat_cooldown = true;
|
||||
char magic_code[16];
|
||||
Format(magic_code, sizeof(magic_code), "add_magic_value_here");
|
||||
Format(magic_code, sizeof(magic_code), autism_bot_code); //included with unloze.secrets simply.
|
||||
Format(msg, sizeof(msg), "clientmessage:%N %s %s", client, magic_code, info);
|
||||
send_socket_msg(msg, strlen(msg), port);
|
||||
CreateTimer(2.0, bot_chat_cooldown);
|
||||
@ -513,7 +514,6 @@ public Action bot_check_connect(Handle timer, any data)
|
||||
|
||||
if (i_port == server_ports[0])
|
||||
{
|
||||
//revert again to either 10 or 55
|
||||
int max_allowed_players = 55;
|
||||
char current_map[128];
|
||||
GetCurrentMap(current_map, sizeof(current_map));
|
||||
@ -525,7 +525,7 @@ public Action bot_check_connect(Handle timer, any data)
|
||||
send_socket_msg(msg, strlen(msg), ports[2]);
|
||||
send_socket_msg(msg, strlen(msg), ports[3]);
|
||||
}
|
||||
else if (client_count < 50)
|
||||
else if (client_count < max_allowed_players)
|
||||
{
|
||||
Format(msg, sizeof(msg), "connect to ze");
|
||||
if (!bot1_connected)
|
||||
|
Loading…
Reference in New Issue
Block a user