Suppenbiatch

CSGO AUTO ACCEPT V1.3 DEBUG

Apr 25th, 2020
2,278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 31.43 KB | None | 0 0
  1. import configparser
  2. import operator
  3. import os
  4. import re
  5. import sys
  6. import time
  7. import webbrowser
  8. import winreg
  9. from datetime import datetime, timedelta
  10.  
  11. import pushbullet
  12. import pyperclip
  13. import pytesseract
  14. import requests
  15. import win32api
  16. import win32con
  17. import win32gui
  18. from PIL import ImageGrab, Image
  19. from playsound import playsound
  20.  
  21.  
  22. def Avg(lst: list):
  23.     if not lst:
  24.         return 0
  25.     return sum(lst) / len(lst)
  26.  
  27.  
  28. # noinspection PyShadowingNames,PyUnusedLocal
  29. def enum_cb(hwnd, results):
  30.     winlist.append((hwnd, win32gui.GetWindowText(hwnd)))
  31.  
  32.  
  33. def mute_csgo(lvl: int):
  34.     os.system(mute_csgo_path + str(lvl))
  35.  
  36.  
  37.  
  38. # noinspection PyShadowingNames
  39. def write(message, add_time: bool = True, push: int = 0, push_now: bool = False, output: bool = True, overwrite: str = '0'):
  40.     if output:
  41.         message = str(message)
  42.         if add_time:
  43.             message = datetime.now().strftime('%H:%M:%S') + ': ' + message
  44.         global last_printed_line
  45.         splits = last_printed_line.split(b'**')
  46.         last_key = splits[0]
  47.         last_string = splits[1].strip(b'\n\r')
  48.         last_end = splits[-1]
  49.         if overwrite != '0':
  50.             ending = console_window['suffix']
  51.             if last_key == overwrite.encode():
  52.                 if console_window['isatty']:
  53.                     print(' ' * len(last_string.decode()), end=ending)
  54.                 message = console_window['prefix'] + message
  55.             else:
  56.                 if last_end != b'\n':
  57.                     message = '\n' + message
  58.         else:
  59.             ending = '\n'
  60.             if last_end != b'\n':
  61.                 message = '\n' + message
  62.  
  63.         last_printed_line = (overwrite + '**' + message + '**' + ending).encode()
  64.         print(message, end=ending)
  65.  
  66.     if push >= 3:
  67.         global note
  68.         if message:
  69.             note = note + str(message.strip('\n\r')) + '\n'
  70.         if push_now:
  71.             device.push_note('CSGO AUTO ACCEPT', note)
  72.             note = ''
  73.  
  74.  
  75. # noinspection PyShadowingNames
  76. def click(x: int, y: int):
  77.     win32api.SetCursorPos((x, y))
  78.     win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)
  79.     win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)
  80.  
  81.  
  82. # noinspection PyShadowingNames
  83. def relate_list(l_org, compare_list, relate: operator = operator.le):
  84.     if not l_org:
  85.         return False
  86.     truth_list = []
  87.     for list_part in compare_list:
  88.         partial_truth = []
  89.         for i, val in enumerate(list_part):
  90.             partial_truth.append(relate(l_org[i], val))
  91.         truth_list.append(all(partial_truth))
  92.         l_org = l_org[len(list_part):]
  93.     return any(truth_list)
  94.  
  95.  
  96. # noinspection PyShadowingNames
  97. def color_average(image: Image, compare_list: list):
  98.     average = []
  99.     r, g, b = [], [], []
  100.     data = image.getdata()
  101.     for i in data:
  102.         r.append(i[0])
  103.         g.append(i[1])
  104.         b.append(i[2])
  105.  
  106.     rgb = [Avg(r), Avg(g), Avg(b)] * len(compare_list)
  107.     for part in compare_list:
  108.         for i, val in enumerate(part):
  109.             average.append(val - rgb[i])
  110.     average = list(map(abs, average))
  111.     return average
  112.  
  113.  
  114. # noinspection PyShadowingNames
  115. def getScreenShot(window_id: int, area: tuple = (0, 0, 0, 0)):
  116.     area = list(area)
  117.     win32gui.ShowWindow(window_id, win32con.SW_MAXIMIZE)
  118.     scaled_area = [screen_width / 2560, screen_height / 1440]
  119.     scaled_area = 2 * scaled_area
  120.     for i, _ in enumerate(area[-2:], start=len(area) - 2):
  121.         area[i] += 1
  122.     for i, val in enumerate(area, start=0):
  123.         scaled_area[i] = scaled_area[i] * val
  124.     scaled_area = list(map(int, scaled_area))
  125.     # time.sleep(0.001)
  126.     image = ImageGrab.grab(scaled_area)
  127.     return image
  128.  
  129.  
  130. # noinspection PyShadowingNames
  131. def getAccountsFromCfg():
  132.     steam_ids = ''
  133.     global accounts
  134.     for i in config.sections():
  135.         if i.startswith('Account'):
  136.             steam_id = config.get(i, 'Steam ID')
  137.             steam_id_3 = str(int(steam_id) - 76561197960265728)
  138.             auth_code = config.get(i, 'Authentication Code')
  139.             match_token = config.get(i, 'Match Token')
  140.             steam_ids += steam_id + ','
  141.             accounts.append({'steam_id': steam_id, 'steam_id_3': steam_id_3, 'auth_code': auth_code, 'match_token': match_token})
  142.  
  143.     steam_ids = steam_ids.lstrip(',').rstrip(',')
  144.     profiles = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=' + cfg['steam_api_key'] + '&steamids=' + steam_ids).json()['response']['players']
  145.     name_list = [online_data['personaname'] for local_acc in accounts for online_data in profiles if online_data['steamid'] == local_acc['steam_id']]
  146.     for num, val in enumerate(accounts):
  147.         val['name'] = name_list[num]
  148.  
  149.  
  150. # noinspection PyShadowingNames
  151. def getCsgoPath(steam_id_3: str):
  152.     steam_reg_key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\WOW6432Node\Valve\Steam')
  153.     steam_path = winreg.QueryValueEx(steam_reg_key, 'InstallPath')[0]
  154.     libraries = [steam_path + '\\steamapps']
  155.     with open(steam_path + '\\steamapps\\libraryfolders.vdf', 'r') as library_file:
  156.         library_data = library_file.readlines()
  157.         compare_str = re.compile('\\t"\d*"\\t\\t"')
  158.         libraries.extend([re.sub(compare_str, "", i.rstrip('"\n')) for i in library_data if bool(re.match(compare_str, i))])
  159.  
  160.     csgo_path = [i for i in libraries if os.path.exists(i + '\\appmanifest_730.acf')][0] + '\\common\\Counter-Strike Global Offensive\\csgo\\'
  161.     if not csgo_path:
  162.         write('DID NOT FIND CSGO PATH', add_time=False)
  163.         exit('LORD PLZ HELP')
  164.  
  165.     userdata_path = steam_path + '\\userdata\\' + steam_id_3 + '\\730\\local\\cfg\\'
  166.     autoexec_strs = ['developer 1', 'con_logfile "console_log.log"', 'con_filter_enable "2"', 'con_filter_text_out "Player:"', 'con_filter_text "Damage"', 'log_color General ' + cfg['log_color']]
  167.     with open(userdata_path + 'autoexec.cfg', 'a+') as autoexec:
  168.         autoexec.seek(0)
  169.         lines = autoexec.readlines()
  170.         for autoexec_str in autoexec_strs:
  171.             if not any(autoexec_str.lower() in line.rstrip('\n').lower() for line in lines):
  172.                 write('Added %s to "autoexec.cfg" file in %s' % (autoexec_str, userdata_path), add_time=False)
  173.                 write('RESTART Counter-Strike for the script to work', add_time=False)
  174.                 autoexec.write('\n' + autoexec_str + '\n')
  175.     if os.path.exists(csgo_path + '\\cfg\\autoexec.cfg'):
  176.         write('YOU HAVE TO DELETE THE "autoexec.cfg" in %s WITH AND MERGE IT WITH THE ONE IN %s' % (csgo_path + '\\cfg', userdata_path), add_time=False)
  177.         write('THE SCRIPT WONT WORK UNTIL THERE IS NO "autoexec.cfg" in %s' % csgo_path + '\\cfg', add_time=False)
  178.         exit()
  179.     return csgo_path
  180.  
  181.  
  182. # noinspection PyShadowingNames
  183. def getOldSharecodes(last_x: int = -1, from_x: str = ''):
  184.     if last_x >= 0:
  185.         return []
  186.     try:
  187.         last_game = open(appdata_path+'last_game_' + accounts[current_account]['steam_id'] + '.txt', 'r')
  188.         games = last_game.readlines()
  189.         last_game.close()
  190.     except FileNotFoundError:
  191.         last_game = open(appdata_path+'last_game_' + accounts[current_account]['steam_id'] + '.txt', 'w')
  192.         last_game.write(accounts[current_account]['match_token'] + '\n')
  193.         games = [accounts[current_account]['match_token']]
  194.         last_game.close()
  195.     last_game = open(appdata_path+'last_game_' + accounts[current_account]['steam_id'] + '.txt', 'w')
  196.     games = games[-200:]
  197.     for i, val in enumerate(games):
  198.         games[i] = 'CSGO' + val.strip('\n').split('CSGO')[1]
  199.         last_game.write(games[i] + '\n')
  200.     last_game.close()
  201.     if from_x:
  202.         try:
  203.             return games[(len(games) - games.index(from_x)) * -1:]
  204.         except ValueError:
  205.             return []
  206.     return games[last_x:]
  207.  
  208.  
  209. # noinspection PyShadowingNames
  210. def getNewCSGOSharecodes(game_id: str):
  211.     sharecodes = []
  212.     next_code = game_id
  213.     last_game = open(appdata_path+'last_game_' + accounts[current_account]['steam_id'] + '.txt', 'a')
  214.     while next_code != 'n/a':
  215.         steam_url = 'https://api.steampowered.com/ICSGOPlayers_730/GetNextMatchSharingCode/v1?key=' + cfg['steam_api_key'] + '&steamid=' + accounts[current_account]['steam_id'] + '&steamidkey=' + accounts[current_account][
  216.             'auth_code'] + '&knowncode=' + game_id
  217.         try:
  218.             next_code = (requests.get(steam_url).json()['result']['nextcode'])
  219.         except KeyError:
  220.             write('WRONG Match Token, Authentication Code or Steam ID ')
  221.             return [{'sharecode': game_id, 'queue_pos': None}]
  222.  
  223.         if next_code:
  224.             if next_code != 'n/a':
  225.                 sharecodes.append(next_code)
  226.                 game_id = next_code
  227.                 last_game.write(next_code + '\n')
  228.     last_game.close()
  229.     return [{'sharecode': code, 'queue_pos': None} for code in sharecodes]
  230.  
  231.  
  232. # noinspection PyShadowingNames
  233. def UpdateCSGOstats(repeater=None, get_all_games=False):
  234.     all_games, completed_games, not_completed_games, = [], [], []
  235.  
  236.     if repeater is None:
  237.         repeater = []
  238.     if repeater:
  239.         if get_all_games:
  240.             sharecodes = [getOldSharecodes(from_x=code['sharecode']) for code in repeater]
  241.             sharecodes = max(sharecodes, key=len)
  242.         else:
  243.             sharecodes = [code['sharecode'] for code in repeater]
  244.         all_games = [requests.post('https://csgostats.gg/match/upload/ajax', data={'sharecode': sharecode, 'index': '1'}).json() for sharecode in sharecodes]
  245.     else:
  246.         num = -1
  247.         sharecode = getOldSharecodes(num)[0]
  248.         while True:
  249.             response = requests.post('https://csgostats.gg/match/upload/ajax', data={'sharecode': sharecode, 'index': '1'})
  250.             all_games.append(response.json())
  251.             if response.json()['status'] != 'complete':
  252.                 num -= 1
  253.                 try:
  254.                     sharecode = getOldSharecodes(num)[0]
  255.                 except IndexError:
  256.                     break
  257.             else:
  258.                 break
  259.         temp_games = [{'sharecode': game['data']['sharecode']} for game in all_games if game['status'] != 'complete']
  260.         if temp_games and len(all_games) > 1:
  261.             all_games = all_games[:-1]
  262.  
  263.     for game in all_games:
  264.         if game['status'] == 'complete':
  265.             completed_games.append(game)
  266.         else:
  267.             not_completed_games.append(game)
  268.  
  269.     queued_games = [{'sharecode': game['data']['sharecode'], 'queue_pos': game['data']['queue_pos']} for game in not_completed_games if game['status'] != 'error']
  270.     corrupt_games = [{'sharecode': game['data']['sharecode'], 'queue_pos': None} for game in not_completed_games if game['status'] == 'error']
  271.  
  272.     global queue_difference, time_table
  273.     if queued_games:
  274.         temp_string = ''
  275.         for i, val in enumerate(queued_games):
  276.             temp_string += '#' + str(i + 1) + ': in Queue #' + str(val['queue_pos']) + ' - '
  277.  
  278.         if repeater:
  279.             current_queue_difference = Avg([last_game['queue_pos'] - game['queue_pos'] for game in queued_games for last_game in repeater if last_game['sharecode'] == game['sharecode'] and last_game['queue_pos'] is not None])
  280.             if current_queue_difference:
  281.                 queue_difference.append(current_queue_difference / ((time.time() - time_table['time_since_retry']) / 60))
  282.                 queue_difference = queue_difference[-10:]
  283.                 matches_per_min = round(Avg(queue_difference), 1)
  284.                 if matches_per_min != 0.0:
  285.                     time_till_done = str(timedelta(seconds=int((queued_games[0]['queue_pos'] / matches_per_min) * 60)))
  286.                 else:
  287.                     time_till_done = '∞:∞:∞'
  288.                 temp_string += str(matches_per_min) + ' matches/min - #1 done in ' + time_till_done
  289.         temp_string = temp_string.rstrip(' - ')
  290.         write(temp_string, add_time=False, overwrite='4')
  291.  
  292.     time_table['time_since_retry'] = time.time()
  293.     repeater = [game for game in queued_games if game['queue_pos'] < cfg['max_queue_position']]
  294.     repeater.extend([game for game in corrupt_games])
  295.  
  296.     if corrupt_games:
  297.         write('An error occurred in %s game[s].' % len(corrupt_games), overwrite='5')
  298.  
  299.     if completed_games:
  300.         for i in completed_games:
  301.             sharecode = i['data']['sharecode']
  302.             game_url = i['data']['url']
  303.             info = ' '.join(i['data']['msg'].replace('-', '').replace('<br />', '. ').split('<')[0].rstrip(' ').split())
  304.             write('Sharecode: %s' % sharecode, add_time=False, push=push_urgency)
  305.             write('URL: %s' % game_url, add_time=False, push=push_urgency)
  306.             write('Status: %s.' % info, add_time=True, push=push_urgency)
  307.             pyperclip.copy(game_url)
  308.         write(None, add_time=False, push=push_urgency, push_now=True, output=False)
  309.     return repeater
  310.  
  311.  
  312. # noinspection PyShadowingNames,PyUnusedLocal
  313. def Image_to_Text(image: Image, size: tuple, white_threshold: tuple, arg: str = ''):
  314.     image_data = image.getdata()
  315.     pixel_map, image_text = [], ''
  316.     for y in range(size[1]):
  317.         for x in range(size[0]):
  318.             if relate_list(image_data[y * size[0] + x], [white_threshold], relate=operator.ge):
  319.                 pixel_map.append((0, 0, 0))
  320.             else:
  321.                 pixel_map.append((255, 255, 255))
  322.     temp_image = Image.new('RGB', (size[0], size[1]))
  323.     temp_image.putdata(pixel_map)
  324.     try:
  325.         image_text = pytesseract.image_to_string(temp_image, timeout=0.3, config=arg)
  326.     except RuntimeError:
  327.         # as timeout_error:
  328.         pass
  329.     if image_text:
  330.         image_text = ' '.join(image_text.replace(': ', ':').split())
  331.         global truth_table
  332.         if truth_table['debugging']:
  333.             image.save(str(cfg['debug_path']) + '\\' + datetime.now().strftime('%H-%M-%S') + '_' + image_text.replace(':', '-') + '.png', format='PNG')
  334.             temp_image.save(str(cfg['debug_path']) + '\\' + datetime.now().strftime('%H-%M-%S') + '_' + image_text.replace(':', '-') + '_temp.png', format='PNG')
  335.         return image_text
  336.     else:
  337.         return ''
  338.  
  339.  
  340. def getCfgData():
  341.     try:
  342.         get_cfg = {'activate_script': int(config.get('HotKeys', 'Activate Script'), 16), 'activate_push_notification': int(config.get('HotKeys', 'Activate Push Notification'), 16),
  343.                    'info_newest_match': int(config.get('HotKeys', 'Get Info on newest Match'), 16), 'mute_csgo_toggle': int(config.get('HotKeys', 'Mute CSGO'), 16),
  344.                    'open_live_tab': int(config.get('HotKeys', 'Live Tab Key'), 16), 'switch_accounts': int(config.get('HotKeys', 'Switch accounts for csgostats.gg'), 16),
  345.                    'end_script': int(config.get('HotKeys', 'End Script'), 16), 'stop_warmup_ocr': config.get('HotKeys', 'Stop Warmup OCR'),
  346.                    'screenshot_interval': float(config.get('Screenshot', 'Interval')), 'timeout_time': config.getint('Screenshot', 'Timeout Time'), 'debug_path': config.get('Screenshot', 'Debug Path'), 'steam_api_key': config.get('csgostats.gg', 'API Key'),
  347.                    'max_queue_position': config.getint('csgostats.gg', 'Auto-Retrying for queue position below'), 'log_color': config.get('Screenshot', 'Log Color').lower(),
  348.                    'auto_retry_interval': config.getint('csgostats.gg', 'Auto-Retrying-Interval'), 'pushbullet_device_name': config.get('Pushbullet', 'Device Name'), 'pushbullet_api_key': config.get('Pushbullet', 'API Key'),
  349.                    'tesseract_path': config.get('Warmup', 'Tesseract Path'), 'warmup_test_interval': config.getint('Warmup', 'Test Interval'), 'warmup_push_interval': config.get('Warmup', 'Push Interval'),
  350.                    'warmup_no_text_limit': config.getint('Warmup', 'No Text Limit')}
  351.         return get_cfg
  352.         # 'imgur_id': config.get('Imgur', 'Client ID'), 'imgur_secret': config.get('Imgur', 'Client Secret'), 'stop_warmup_ocr': int(config.get('HotKeys', 'Stop Warmup OCR'), 16), 'info_multiple_matches': int(config.get('HotKeys', 'Get Info on multiple Matches'), 16),
  353.     except (configparser.NoOptionError, configparser.NoSectionError, ValueError):
  354.         write('ERROR IN CONFIG')
  355.         exit('CHECK FOR NEW CONFIG')
  356.  
  357.  
  358. # OVERWRITE SETUP
  359. appdata_path = os.getenv('APPDATA') + '\\CSGO AUTO ACCEPT\\'
  360. try:
  361.     os.mkdir(appdata_path)
  362. except FileExistsError:
  363.     pass
  364. last_printed_line = b'0**\n'
  365. console_window = {}
  366. if not sys.stdout.isatty():
  367.     console_window = {'prefix': '\r', 'suffix': '', 'isatty': False}
  368. else:
  369.     console_window = {'prefix': '', 'suffix': '\r', 'isatty': True}
  370.  
  371. # CONFIG HANDLING
  372. config = configparser.ConfigParser()
  373. config.read('config.ini')
  374. cfg = getCfgData()
  375. cfg['timeout_time'] = int(cfg['timeout_time'] / cfg['screenshot_interval'])
  376. cfg['stop_warmup_ocr'] = [int(i, 16) for i in cfg['stop_warmup_ocr'].split('-')]
  377. cfg['stop_warmup_ocr'][1] += 1
  378. device = 0
  379.  
  380. # ACCOUNT HANDLING, GETTING ACCOUNT NAME, GETTING CSGO PATH, CHECKING AUTOEXEC
  381. accounts, current_account = [], 0
  382. getAccountsFromCfg()
  383. csgo_path = getCsgoPath(accounts[current_account]['steam_id_3'])
  384. match_server_ready = re.compile('^Server reservation check .* ready-up!$')
  385. match_reservation = 'Matchmaking reservation confirmed: '
  386. match_warmup_time = re.compile('\d+?:\d+')
  387. inverted_warmup_time = re.compile('[^\d:]')
  388. with open(csgo_path + 'console_log.log', 'w') as log:
  389.     log.write('')
  390. with open(cfg['debug_path'] + '\\console.log', 'w') as debug_log:
  391.     debug_log.write('')
  392.  
  393. # INITIALIZATION FOR getScreenShot
  394. screen_width, screen_height = win32api.GetSystemMetrics(0), win32api.GetSystemMetrics(1)
  395. hwnd = 0
  396. toplist, csgo = [], []
  397.  
  398. # BOOLEAN, TIME INITIALIZATION
  399. truth_table = {'test_for_accept_button': False, 'test_for_success': False, 'test_for_warmup': False, 'first_ocr': True, 'testing': False, 'debugging': False, 'first_push': True, 'test_for_server': False}
  400. time_table = {'screenshot_time': time.time(), 'time_since_retry': time.time(), 'warmup_test_timer': time.time(), 'time_searching': time.time(), 'not_searching_cc': time.time(), 'searching_cc': time.time()}
  401. test_for_accept_counter = 0
  402.  
  403. # csgostats.gg VAR
  404. retryer = []
  405.  
  406. # WARMUP DETECTION SETUP
  407. pytesseract.pytesseract.tesseract_cmd = cfg['tesseract_path']
  408. no_text_found, push_counter = 0, 0
  409. push_times = [int(i) for i in cfg['warmup_push_interval'].split(',')]
  410. push_times.sort(reverse=True)
  411. join_warmup_time = push_times[0] + 1
  412.  
  413. # PUSHBULLET VAR
  414. note = ''
  415. push_urgency = 0
  416.  
  417. # MUTE CSGO PATH
  418. mute_csgo_path = '"' + os.getcwd() + '\\sounds\\nircmdc.exe" muteappvolume csgo.exe '
  419. mute_csgo(0)
  420.  
  421. write('READY')
  422. write('Current account is: %s\n' % accounts[current_account]['name'], add_time=False)
  423.  
  424.  
  425. while True:
  426.     if win32api.GetAsyncKeyState(cfg['activate_script']) & 1:  # F9 (ACTIVATE / DEACTIVATE SCRIPT)
  427.         truth_table['test_for_server'] = not truth_table['test_for_server']
  428.         write('TESTING: %s' % truth_table['test_for_server'], overwrite='1')
  429.         if truth_table['test_for_server']:
  430.             playsound('sounds/activated_2.mp3')
  431.             time_table['time_searching'] = time.time()
  432.             mute_csgo(1)
  433.         else:
  434.             playsound('sounds/deactivated.mp3')
  435.             mute_csgo(0)
  436.  
  437.     if win32api.GetAsyncKeyState(cfg['activate_push_notification']) & 1:  # F8 (ACTIVATE / DEACTIVATE PUSH NOTIFICATION)
  438.         if not device:
  439.             try:
  440.                 device = pushbullet.PushBullet(cfg['pushbullet_api_key']).get_device(cfg['pushbullet_device_name'])
  441.             except (pushbullet.errors.PushbulletError, pushbullet.errors.InvalidKeyError):
  442.                 write('Pushbullet is wrongly configured.\nWrong API Key or DeviceName in config.ini')
  443.         if device:
  444.             push_urgency += 1
  445.             if push_urgency > 3:
  446.                 push_urgency = 0
  447.             push_info = ['not active', 'only if accepted', 'all game status related information', 'all information (game status/csgostats.gg information)']
  448.             write('Pushing: %s' % push_info[push_urgency], overwrite='2')
  449.  
  450.     if win32api.GetAsyncKeyState(cfg['info_newest_match']) & 1:  # F7 Key (UPLOAD NEWEST MATCH)
  451.         write('Uploading / Getting status on newest match')
  452.         queue_difference = []
  453.         new_sharecodes = getNewCSGOSharecodes(getOldSharecodes(-1)[0])
  454.         for new_code in new_sharecodes:
  455.             retryer.append(new_code) if new_code['sharecode'] not in [old_code['sharecode'] for old_code in retryer] else retryer
  456.         retryer = UpdateCSGOstats(retryer, get_all_games=True)
  457.  
  458.     if win32api.GetAsyncKeyState(cfg['open_live_tab']) & 1:  # F13 Key (OPEN WEB BROWSER ON LIVE GAME TAB)
  459.         win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
  460.         webbrowser.open_new_tab('https://csgostats.gg/player/' + accounts[current_account]['steam_id'] + '#/live')
  461.         write('new tab opened', add_time=False)
  462.         time.sleep(0.5)
  463.         win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
  464.  
  465.     if win32api.GetAsyncKeyState(cfg['switch_accounts']) & 1:  # F15 (SWITCH ACCOUNTS)
  466.         current_account += 1
  467.         if current_account > len(accounts) - 1:
  468.             current_account = 0
  469.         getCsgoPath(accounts[current_account]['steam_id_3'])
  470.         write('current account is: %s' % accounts[current_account]['name'], add_time=False, overwrite='3')
  471.  
  472.     if win32api.GetAsyncKeyState(cfg['mute_csgo_toggle']) & 1:  # POS1 (END SCRIPT)
  473.         write("MUTE TOGGLED", add_time=False)
  474.         mute_csgo(2)
  475.  
  476.     if win32api.GetAsyncKeyState(cfg['end_script']) & 1:  # POS1 (END SCRIPT)
  477.         write('Exiting Script')
  478.         break
  479.  
  480.     if retryer:
  481.         if time.time() - time_table['time_since_retry'] > cfg['auto_retry_interval']:
  482.             retryer = UpdateCSGOstats(retryer)
  483.     winlist = []
  484.     win32gui.EnumWindows(enum_cb, toplist)
  485.     csgo = [(hwnd, title) for hwnd, title in winlist if 'counter-strike: global offensive' in title.lower()]
  486.     if not csgo:
  487.         continue
  488.     hwnd = csgo[0][0]
  489.  
  490.     # TESTING HERE
  491.     if win32api.GetAsyncKeyState(0x6F) & 1:  # UNBOUND, TEST CODE
  492.         # truth_table['debugging'] = not truth_table['debugging']
  493.         truth_table['test_for_warmup'] = not truth_table['test_for_warmup']
  494.         write('DEBUGGING: %s\n' % truth_table['debugging'])
  495.  
  496.     if truth_table['testing']:
  497.         # time_table['screenshot_time'] = time.time()
  498.         pass
  499.         # print('Took: %s ' % str(timedelta(milliseconds=int(time.time(*1000 - time_table['screenshot_time']*1000))))
  500.     # TESTING ENDS HERE
  501.  
  502.     if truth_table['test_for_server']:
  503.         if time.time() - time_table['searching_cc'] > 0.2:
  504.             time_table['searching_cc'] = time.time()
  505.         else:
  506.             continue
  507.         with open(csgo_path + 'console_log.log', 'rb+') as log:
  508.             log_lines = log.readlines()
  509.             console_line = [line.decode('utf-8', 'ignore').encode("utf-8").rstrip(b'\n\r').decode() for line in log_lines]
  510.             log.seek(0)
  511.             log.truncate()
  512.         with open(cfg['debug_path'] + '\\console.log', 'ab') as debug_log:
  513.             [debug_log.write(i) for i in log_lines]
  514.         # server_ready = any([bool(re.match(match_server_ready, i)) for i in console_line])
  515.         server_ready = any(match_reservation in i for i in console_line)
  516.         if server_ready:
  517.             test_for_accept_counter = 0
  518.             write('Server found, starting to look for accept button')
  519.             truth_table['test_for_accept_button'] = True
  520.             # truth_table['test_for_server'] = False
  521.             playsound('sounds/server_found.mp3')
  522.             win32gui.ShowWindow(hwnd, win32con.SW_MAXIMIZE)
  523.     else:
  524.         if time.time() - time_table['not_searching_cc'] > 20:
  525.             time_table['not_searching_cc'] = time.time()
  526.             with open(csgo_path + 'console_log.log', 'rb+') as log:
  527.                 log_lines = log.readlines()
  528.                 log.seek(0)
  529.                 log.truncate()
  530.             with open(cfg['debug_path'] + '\\console.log', 'ab') as debug_log:
  531.                 [debug_log.write(i) for i in log_lines]
  532.  
  533.  
  534.     if truth_table['test_for_accept_button']:
  535.         if time.time() - time_table['screenshot_time'] < cfg['screenshot_interval']:
  536.             continue
  537.         time_table['screenshot_time'] = time.time()
  538.         img = getScreenShot(hwnd, (1265, 760, 1295, 785))
  539.         if not img:
  540.             continue
  541.         accept_avg = color_average(img, [(76, 176, 80), (89, 203, 94)])
  542.         mute_csgo(0)
  543.         if relate_list(accept_avg, [(2, 2, 2), (2, 2, 2)]):
  544.             write('Trying to Accept', push=push_urgency + 1)
  545.  
  546.             truth_table['test_for_success'] = True
  547.             truth_table['test_for_accept_button'] = False
  548.             truth_table['test_for_server'] = False
  549.             accept_avg = []
  550.  
  551.             for _ in range(5):
  552.                 click(int(screen_width / 2), int(screen_height / 1.78))
  553.                 pass
  554.  
  555.             write('Trying to catch a loading map')
  556.             playsound('sounds/accept_found.mp3')
  557.             time_table['screenshot_time'] = time.time()
  558.         test_for_accept_counter += 1
  559.         if test_for_accept_counter > cfg['timeout_time']:
  560.             write('NO ACCEPT BUTTON FOUND AFTER %s seconds.' % str(int(cfg['timeout_time']*cfg['screenshot_interval'])))
  561.             write('Continuing to look for ready server.')
  562.             mute_csgo(1)
  563.             playsound('sounds/back_to_testing.mp3')
  564.             truth_table['test_for_accept_button'] = False
  565.  
  566.     if truth_table['test_for_success']:
  567.         if time.time() - time_table['screenshot_time'] < 40:
  568.             img = getScreenShot(hwnd, (2435, 65, 2555, 100))
  569.             not_searching_avg = color_average(img, [(6, 10, 10)])
  570.             searching_avg = color_average(img, [(6, 163, 97), (4, 63, 35)])
  571.  
  572.             not_searching = relate_list(not_searching_avg, [(2, 5, 5)])
  573.             searching = relate_list(searching_avg, [(2.7, 55, 35), (1, 50, 35)])
  574.  
  575.             img = getScreenShot(hwnd, (467, 1409, 1300, 1417))
  576.             success_avg = color_average(img, [(21, 123, 169)])
  577.             success = relate_list(success_avg, [(1, 8, 7)])
  578.  
  579.             if success:
  580.                 write('\tTook %s since pressing accept.' % str(timedelta(seconds=int(time.time() - time_table['screenshot_time']))), add_time=False, push=push_urgency + 1)
  581.                 write('\tTook %s since trying to find a game.' % str(timedelta(seconds=int(time.time() - time_table['time_searching']))), add_time=False, push=push_urgency + 1)
  582.                 write('Game should have started', push=push_urgency + 2, push_now=True)
  583.                 truth_table['test_for_success'] = False
  584.                 truth_table['test_for_warmup'] = True
  585.                 playsound('sounds/done_testing.mp3')
  586.                 time_table['warmup_test_timer'] = time.time() + 5
  587.                 continue
  588.  
  589.             if any([searching, not_searching]):
  590.                 write('\tTook: %s ' % str(timedelta(seconds=int(time.time() - time_table['screenshot_time']))), add_time=False, push=push_urgency + 1)
  591.                 write('Game doesnt seem to have started. Continuing to search for a Server!', push=push_urgency + 1, push_now=True)
  592.                 playsound('sounds/back_to_testing.mp3')
  593.                 mute_csgo(1)
  594.                 truth_table['test_for_success'] = False
  595.                 truth_table['test_for_server'] = True
  596.                 continue
  597.  
  598.         else:
  599.             write('40 Seconds after accept, did not find a loading map nor searching queue')
  600.             truth_table['test_for_success'] = False
  601.             # noinspection PyUnboundLocalVariable
  602.             print(success_avg)
  603.             # noinspection PyUnboundLocalVariable
  604.             print(searching_avg)
  605.             # noinspection PyUnboundLocalVariable
  606.             print(not_searching_avg)
  607.             playsound('sounds/fail.mp3')
  608.             # noinspection PyUnboundLocalVariable
  609.             img.save(cfg['debug_path'] + '\\Unknown Error.png')
  610.  
  611.     if truth_table['test_for_warmup']:
  612.  
  613.         for i in range(cfg['stop_warmup_ocr'][0], cfg['stop_warmup_ocr'][1]):
  614.             win32api.GetAsyncKeyState(i) & 1
  615.         while True:
  616.             keys = [(win32api.GetAsyncKeyState(i) & 1) for i in range(cfg['stop_warmup_ocr'][0], cfg['stop_warmup_ocr'][1])]
  617.  
  618.             if any(keys):
  619.                 write('Break from warmup-loop')
  620.                 truth_table['test_for_warmup'] = False
  621.                 truth_table['first_ocr'] = True
  622.                 truth_table['first_push'] = True
  623.                 break
  624.  
  625.             if time.time() - time_table['warmup_test_timer'] >= cfg['warmup_test_interval']:
  626.                 img = getScreenShot(hwnd, (1036, 425, 1525, 456))  # 'WAITING FOR PLAYERS X:XX'
  627.                 img_text = Image_to_Text(img, img.size, (225, 225, 225), arg='--psm 6')
  628.                 time_table['warmup_test_timer'] = time.time()
  629.                 time_left = re.sub(inverted_warmup_time, "", img_text)
  630.                 if time_left:
  631.                     time_left = time_left.split()[-1].split(':')
  632.                     # write(img_text, add_time=False)
  633.                     try:
  634.                         time_left = int(time_left[0]) * 60 + int(time_left[1])
  635.                         if truth_table['first_ocr']:
  636.                             join_warmup_time = time_left
  637.                             time_table['screenshot_time'] = time.time()
  638.                             truth_table['first_ocr'] = False
  639.  
  640.                     except (ValueError, IndexError):
  641.                         continue
  642.  
  643.                     time_left_data = timedelta(seconds=int(time.time() - time_table['screenshot_time'])), time.strftime('%H:%M:%S', time.gmtime(abs((join_warmup_time - time_left) - (time.time() - time_table['screenshot_time'])))), img_text
  644.                     write('Time since start: %s - Time Difference: %s - Time left: %s' % (time_left_data[0], time_left_data[1], time_left_data[2]), add_time=False, overwrite='1')
  645.                     if no_text_found > 0:
  646.                         no_text_found = 0
  647.  
  648.                     if time_left <= push_times[push_counter]:
  649.                         push_counter += 1
  650.                         write('Time since start: %s\nTime Difference: %s\nTime left: %s' % (time_left_data[0], time_left_data[1], time_left_data[2]), push=push_urgency + 1, push_now=True, output=False)
  651.  
  652.                     if truth_table['first_push']:
  653.                         if abs((join_warmup_time - time_left) - (time.time() - time_table['screenshot_time'])) >= 5:
  654.                             truth_table['first_push'] = False
  655.                             write('Match should start in ' + str(time_left) + ' seconds, All players have connected', push=push_urgency + 2, push_now=True)
  656.  
  657.                 else:
  658.                     no_text_found += 1
  659.  
  660.             if push_counter >= len(push_times):
  661.                 push_counter = 0
  662.                 no_text_found = 0
  663.                 truth_table['test_for_warmup'] = False
  664.                 truth_table['first_ocr'] = True
  665.                 truth_table['first_push'] = True
  666.                 write('Warmup should be over in less then %s seconds!' % push_times[-1], push=push_urgency + 2, push_now=True)
  667.                 break
  668.  
  669.             if no_text_found >= cfg['warmup_no_text_limit']:
  670.                 push_counter = 0
  671.                 no_text_found = 0
  672.                 truth_table['test_for_warmup'] = False
  673.                 truth_table['first_ocr'] = True
  674.                 truth_table['first_push'] = True
  675.                 write('Did not find any warmup text.', push=push_urgency + 2, push_now=True)
  676.                 break
  677. if console_window['isatty']:
  678.     if last_printed_line.split(b'**')[-1] != b'\n':
  679.         print('')
  680. exit('ENDED BY USER')
Add Comment
Please, Sign In to add comment