Mirror of https://github.com/Jxck-S/plane-notify
This is the backend to ElonsJet and other bots
acasads-badsbadsbexchangeadsbxairportemergency-squawklandopenskyopensky-apiopensky-networkplaneresolutionadviosrysquawktakeofftcas
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
6.6 KiB
155 lines
6.6 KiB
import configparser |
|
import time |
|
from colorama import Fore, Back, Style |
|
import platform |
|
import traceback |
|
if platform.system() == "Windows": |
|
from colorama import init |
|
init(convert=True) |
|
from planeClass import Plane |
|
from datetime import datetime |
|
import pytz |
|
import os |
|
if 'plane-notify' not in os.getcwd(): |
|
os.chdir('./plane-notify') |
|
import sys |
|
sys.path.extend([os.getcwd()]) |
|
required_files = [("Roboto-Regular.ttf", 'https://github.com/google/fonts/raw/master/apache/roboto/static/Roboto-Regular.ttf'), ('airports.csv', 'https://ourairports.com/data/airports.csv'), ('regions.csv', 'https://ourairports.com/data/regions.csv')] |
|
for file in required_files: |
|
file_name = file[0] |
|
url = file[1] |
|
if not os.path.isfile(file_name): |
|
print(file_name, "does not exist downloading now") |
|
try: |
|
import requests |
|
file_content = requests.get(url) |
|
|
|
open(file_name, 'wb').write(file_content.content) |
|
except: |
|
raise("Error getting", file_name, "from", url) |
|
else: |
|
print("Successfully got", file_name) |
|
elif os.path.isfile(file_name): |
|
print("Already have", file_name, "continuing") |
|
main_config = configparser.ConfigParser() |
|
main_config.read('./configs/mainconf.ini') |
|
source = main_config.get('DATA', 'SOURCE') |
|
if main_config.getboolean('DISCORD', 'ENABLE'): |
|
from discord_webhook import DiscordWebhook |
|
webhook = DiscordWebhook(url= main_config.get('DISCORD', 'URL'), content=(str("Started"))) |
|
webhook.execute() |
|
try: |
|
print("Source is set to", source) |
|
import sys |
|
#Setup plane objects from plane configs |
|
planes = {} |
|
print("Found the following configs") |
|
for dirpath, dirname, filename in os.walk("./configs"): |
|
for filename in [f for f in filename if f.endswith(".ini") and f != "mainconf.ini"]: |
|
if not "disabled" in dirpath: |
|
print(os.path.join(dirpath, filename)) |
|
plane_config = configparser.ConfigParser() |
|
plane_config.read((os.path.join(dirpath, filename))) |
|
#Creates a Key labeled the ICAO of the plane, with the value being a plane object |
|
planes[plane_config.get('DATA', 'ICAO').upper()] = Plane(plane_config.get('DATA', 'ICAO'), os.path.join(dirpath, filename), plane_config) |
|
|
|
running_Count = 0 |
|
failed_count = 0 |
|
try: |
|
tz = pytz.timezone(main_config.get('DATA', 'TZ')) |
|
except pytz.exceptions.UnknownTimeZoneError: |
|
tz = pytz.UTC |
|
|
|
while True: |
|
datetime_tz = datetime.now(tz) |
|
if datetime_tz.hour == 0 and datetime_tz.minute == 0: |
|
running_Count = 0 |
|
running_Count +=1 |
|
start_time = time.time() |
|
header = ("-------- " + str(running_Count) + " -------- " + str(datetime_tz.strftime("%I:%M:%S %p")) + " ---------------------------------------------------------------------------") |
|
print (Back.GREEN + Fore.BLACK + header[0:100] + Style.RESET_ALL) |
|
if source == "ADSBX": |
|
api_version = int(main_config.get('ADSBX', 'API_VERSION')) |
|
if api_version == 2: |
|
icao_key = 'hex' |
|
elif api_version == 1: |
|
icao_key = 'icao' |
|
else: |
|
raise Exception("Invalid API Version") |
|
from defADSBX import pullADSBX |
|
data, failed = pullADSBX(planes) |
|
if failed == False: |
|
if data['ac'] != None: |
|
for key, obj in planes.items(): |
|
has_data = False |
|
for planeData in data['ac']: |
|
if planeData[icao_key].upper() == key: |
|
if api_version == 1: |
|
obj.run_ADSBXv1(planeData) |
|
elif api_version == 2: |
|
obj.run_ADSBXv2(planeData) |
|
has_data = True |
|
break |
|
if has_data is False: |
|
obj.run_empty() |
|
else: |
|
for obj in planes.values(): |
|
obj.run_empty() |
|
elif failed: |
|
failed_count += 1 |
|
elif source == "OPENS": |
|
from defOpenSky import pullOpenSky |
|
planeData, failed = pullOpenSky(planes) |
|
if failed == False: |
|
if planeData.states != []: |
|
# print(planeData.time) |
|
for key, obj in planes.items(): |
|
has_data = False |
|
for dataState in planeData.states: |
|
if (dataState.icao24).upper() == key: |
|
obj.run_OPENS(dataState) |
|
has_data = True |
|
break |
|
if has_data is False: |
|
obj.run_empty() |
|
else: |
|
for obj in planes.values(): |
|
obj.run_empty() |
|
elif failed: |
|
failed_count += 1 |
|
if failed_count >= 10: |
|
if source == "OPENS": |
|
source = "ADSBX" |
|
elif source == "ADSBX": |
|
source = "OPENS" |
|
failed_count = 0 |
|
if main_config.getboolean('DISCORD', 'ENABLE'): |
|
webhook = DiscordWebhook(url= main_config.get('DISCORD', 'URL'), content=(str("Failed over to " + source))) |
|
webhook.execute() |
|
elapsed_calc_time = time.time() - start_time |
|
datetime_tz = datetime.now(tz) |
|
footer = "-------- " + str(running_Count) + " -------- " + str(datetime_tz.strftime("%I:%M:%S %p")) + " ------------------------Elapsed Time- " + str(round(elapsed_calc_time, 3)) + " -------------------------------------" |
|
print (Back.GREEN + Fore.BLACK + footer[0:100] + Style.RESET_ALL) |
|
|
|
|
|
sleep_sec = 30 |
|
for i in range(sleep_sec,0,-1): |
|
if i < 10: |
|
i = " " + str(i) |
|
sys.stdout.write("\r") |
|
sys.stdout.write(Back.RED + "Sleep {00000000}".format(i) + Style.RESET_ALL) |
|
sys.stdout.flush() |
|
time.sleep(1) |
|
sys.stdout.write(Back.RED + ('\x1b[1K\r' +"Slept for " +str(sleep_sec)) + Style.RESET_ALL) |
|
print() |
|
except KeyboardInterrupt as e: |
|
print(e) |
|
if main_config.getboolean('DISCORD', 'ENABLE'): |
|
webhook = DiscordWebhook(url= main_config.get('DISCORD', 'URL'), content=(str("Manual Exit: " + str(e) ))) |
|
webhook.execute() |
|
except BaseException as e: |
|
print(e) |
|
print(traceback.format_exc()) |
|
if main_config.getboolean('DISCORD', 'ENABLE'): |
|
webhook = DiscordWebhook(url= main_config.get('DISCORD', 'URL'), content=(str("Error Exiting: " + str(e) ))) |
|
webhook.execute() |