· 6 years ago · Apr 25, 2020, 09:00 PM
1import configparser
2import operator
3import os
4import re
5import sys
6import time
7import webbrowser
8import winreg
9from datetime import datetime, timedelta
10
11import pushbullet
12import pyperclip
13import pytesseract
14import requests
15import win32api
16import win32con
17import win32gui
18from PIL import ImageGrab, Image
19from playsound import playsound
20
21
22def Avg(lst: list):
23 if not lst:
24 return 0
25 return sum(lst) / len(lst)
26
27
28# noinspection PyShadowingNames,PyUnusedLocal
29def enum_cb(hwnd, results):
30 winlist.append((hwnd, win32gui.GetWindowText(hwnd)))
31
32
33def mute_csgo(lvl: int):
34 os.system(mute_csgo_path + str(lvl))
35
36
37
38# noinspection PyShadowingNames
39def 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
76def 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
83def 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
97def 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
115def 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
131def 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
151def 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
183def 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
210def 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
233def 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
313def 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
340def 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
359appdata_path = os.getenv('APPDATA') + '\\CSGO AUTO ACCEPT\\'
360try:
361 os.mkdir(appdata_path)
362except FileExistsError:
363 pass
364last_printed_line = b'0**\n'
365console_window = {}
366if not sys.stdout.isatty():
367 console_window = {'prefix': '\r', 'suffix': '', 'isatty': False}
368else:
369 console_window = {'prefix': '', 'suffix': '\r', 'isatty': True}
370
371# CONFIG HANDLING
372config = configparser.ConfigParser()
373config.read('config.ini')
374cfg = getCfgData()
375cfg['timeout_time'] = int(cfg['timeout_time'] / cfg['screenshot_interval'])
376cfg['stop_warmup_ocr'] = [int(i, 16) for i in cfg['stop_warmup_ocr'].split('-')]
377cfg['stop_warmup_ocr'][1] += 1
378device = 0
379
380# ACCOUNT HANDLING, GETTING ACCOUNT NAME, GETTING CSGO PATH, CHECKING AUTOEXEC
381accounts, current_account = [], 0
382getAccountsFromCfg()
383csgo_path = getCsgoPath(accounts[current_account]['steam_id_3'])
384match_server_ready = re.compile('^Server reservation check .* ready-up!$')
385match_reservation = 'Matchmaking reservation confirmed: '
386match_warmup_time = re.compile('\d+?:\d+')
387inverted_warmup_time = re.compile('[^\d:]')
388with open(csgo_path + 'console_log.log', 'w') as log:
389 log.write('')
390with open(cfg['debug_path'] + '\\console.log', 'w') as debug_log:
391 debug_log.write('')
392
393# INITIALIZATION FOR getScreenShot
394screen_width, screen_height = win32api.GetSystemMetrics(0), win32api.GetSystemMetrics(1)
395hwnd = 0
396toplist, csgo = [], []
397
398# BOOLEAN, TIME INITIALIZATION
399truth_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}
400time_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()}
401test_for_accept_counter = 0
402
403# csgostats.gg VAR
404retryer = []
405
406# WARMUP DETECTION SETUP
407pytesseract.pytesseract.tesseract_cmd = cfg['tesseract_path']
408no_text_found, push_counter = 0, 0
409push_times = [int(i) for i in cfg['warmup_push_interval'].split(',')]
410push_times.sort(reverse=True)
411join_warmup_time = push_times[0] + 1
412
413# PUSHBULLET VAR
414note = ''
415push_urgency = 0
416
417# MUTE CSGO PATH
418mute_csgo_path = '"' + os.getcwd() + '\\sounds\\nircmdc.exe" muteappvolume csgo.exe '
419mute_csgo(0)
420
421write('READY')
422write('Current account is: %s\n' % accounts[current_account]['name'], add_time=False)
423
424
425while 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', 'w') as log:
527 # log.write('')
528
529
530 if truth_table['test_for_accept_button']:
531 if time.time() - time_table['screenshot_time'] < cfg['screenshot_interval']:
532 continue
533 time_table['screenshot_time'] = time.time()
534 img = getScreenShot(hwnd, (1265, 760, 1295, 785))
535 if not img:
536 continue
537 accept_avg = color_average(img, [(76, 176, 80), (89, 203, 94)])
538 mute_csgo(0)
539 if relate_list(accept_avg, [(2, 2, 2), (2, 2, 2)]):
540 write('Trying to Accept', push=push_urgency + 1)
541
542 truth_table['test_for_success'] = True
543 truth_table['test_for_accept_button'] = False
544 truth_table['test_for_server'] = False
545 accept_avg = []
546
547 for _ in range(5):
548 click(int(screen_width / 2), int(screen_height / 1.78))
549 pass
550
551 write('Trying to catch a loading map')
552 playsound('sounds/accept_found.mp3')
553 time_table['screenshot_time'] = time.time()
554 test_for_accept_counter += 1
555 if test_for_accept_counter > cfg['timeout_time']:
556 write('NO ACCEPT BUTTON FOUND AFTER %s seconds.' % str(int(cfg['timeout_time']*cfg['screenshot_interval'])))
557 write('Continuing to look for ready server.')
558 mute_csgo(1)
559 playsound('sounds/back_to_testing.mp3')
560 truth_table['test_for_accept_button'] = False
561
562 if truth_table['test_for_success']:
563 if time.time() - time_table['screenshot_time'] < 40:
564 img = getScreenShot(hwnd, (2435, 65, 2555, 100))
565 not_searching_avg = color_average(img, [(6, 10, 10)])
566 searching_avg = color_average(img, [(6, 163, 97), (4, 63, 35)])
567
568 not_searching = relate_list(not_searching_avg, [(2, 5, 5)])
569 searching = relate_list(searching_avg, [(2.7, 55, 35), (1, 50, 35)])
570
571 img = getScreenShot(hwnd, (467, 1409, 1300, 1417))
572 success_avg = color_average(img, [(21, 123, 169)])
573 success = relate_list(success_avg, [(1, 8, 7)])
574
575 if success:
576 write('\tTook %s since pressing accept.' % str(timedelta(seconds=int(time.time() - time_table['screenshot_time']))), add_time=False, push=push_urgency + 1)
577 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)
578 write('Game should have started', push=push_urgency + 2, push_now=True)
579 truth_table['test_for_success'] = False
580 truth_table['test_for_warmup'] = True
581 playsound('sounds/done_testing.mp3')
582 time_table['warmup_test_timer'] = time.time() + 5
583 continue
584
585 if any([searching, not_searching]):
586 write('\tTook: %s ' % str(timedelta(seconds=int(time.time() - time_table['screenshot_time']))), add_time=False, push=push_urgency + 1)
587 write('Game doesnt seem to have started. Continuing to search for a Server!', push=push_urgency + 1, push_now=True)
588 playsound('sounds/back_to_testing.mp3')
589 mute_csgo(1)
590 truth_table['test_for_success'] = False
591 truth_table['test_for_server'] = True
592 continue
593
594 else:
595 write('40 Seconds after accept, did not find a loading map nor searching queue')
596 truth_table['test_for_success'] = False
597 # noinspection PyUnboundLocalVariable
598 print(success_avg)
599 # noinspection PyUnboundLocalVariable
600 print(searching_avg)
601 # noinspection PyUnboundLocalVariable
602 print(not_searching_avg)
603 playsound('sounds/fail.mp3')
604 # noinspection PyUnboundLocalVariable
605 img.save(cfg['debug_path'] + '\\Unknown Error.png')
606
607 if truth_table['test_for_warmup']:
608
609 for i in range(cfg['stop_warmup_ocr'][0], cfg['stop_warmup_ocr'][1]):
610 win32api.GetAsyncKeyState(i) & 1
611 while True:
612 keys = [(win32api.GetAsyncKeyState(i) & 1) for i in range(cfg['stop_warmup_ocr'][0], cfg['stop_warmup_ocr'][1])]
613
614 if any(keys):
615 write('Break from warmup-loop')
616 truth_table['test_for_warmup'] = False
617 truth_table['first_ocr'] = True
618 truth_table['first_push'] = True
619 break
620
621 if time.time() - time_table['warmup_test_timer'] >= cfg['warmup_test_interval']:
622 img = getScreenShot(hwnd, (1036, 425, 1525, 456)) # 'WAITING FOR PLAYERS X:XX'
623 img_text = Image_to_Text(img, img.size, (225, 225, 225), arg='--psm 6')
624 time_table['warmup_test_timer'] = time.time()
625 time_left = re.sub(inverted_warmup_time, "", img_text)
626 if time_left:
627 time_left = time_left.split()[-1].split(':')
628 # write(img_text, add_time=False)
629 try:
630 time_left = int(time_left[0]) * 60 + int(time_left[1])
631 if truth_table['first_ocr']:
632 join_warmup_time = time_left
633 time_table['screenshot_time'] = time.time()
634 truth_table['first_ocr'] = False
635
636 except (ValueError, IndexError):
637 continue
638
639 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
640 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')
641 if no_text_found > 0:
642 no_text_found = 0
643
644 if time_left <= push_times[push_counter]:
645 push_counter += 1
646 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)
647
648 if truth_table['first_push']:
649 if abs((join_warmup_time - time_left) - (time.time() - time_table['screenshot_time'])) >= 5:
650 truth_table['first_push'] = False
651 write('Match should start in ' + str(time_left) + ' seconds, All players have connected', push=push_urgency + 2, push_now=True)
652
653 else:
654 no_text_found += 1
655
656 if push_counter >= len(push_times):
657 push_counter = 0
658 no_text_found = 0
659 truth_table['test_for_warmup'] = False
660 truth_table['first_ocr'] = True
661 truth_table['first_push'] = True
662 write('Warmup should be over in less then %s seconds!' % push_times[-1], push=push_urgency + 2, push_now=True)
663 break
664
665 if no_text_found >= cfg['warmup_no_text_limit']:
666 push_counter = 0
667 no_text_found = 0
668 truth_table['test_for_warmup'] = False
669 truth_table['first_ocr'] = True
670 truth_table['first_push'] = True
671 write('Did not find any warmup text.', push=push_urgency + 2, push_now=True)
672 break
673if console_window['isatty']:
674 if last_printed_line.split(b'**')[-1] != b'\n':
675 print('')
676exit('ENDED BY USER')