Browse Source

Minor pushes of old updates

-Minor Linux fixes for /tmp,
-remove seperate discord messages, all one
-Fix empty discord roles
pull/79/head
Jxck-S 2 years ago
parent
commit
f600964f93
  1. 14
      __main__.py
  2. 8
      defAirport.py
  3. 10
      defSS.py
  4. 9
      fuel_calc.py
  5. 45
      planeClass.py

14
__main__.py

@ -4,13 +4,19 @@ import time
from colorama import Fore, Back, Style from colorama import Fore, Back, Style
import platform import platform
import traceback import traceback
import os
if platform.system() == "Windows": if platform.system() == "Windows":
from colorama import init from colorama import init
init(convert=True) init(convert=True)
elif platform.system() == "Linux":
if os.path.exists("/tmp/plane-notify"):
import shutil
shutil.rmtree("/tmp/plane-notify")
os.makedirs("/tmp/plane-notify")
os.makedirs("/tmp/plane-notify/chrome")
from planeClass import Plane from planeClass import Plane
from datetime import datetime from datetime import datetime
import pytz import pytz
import os
import signal import signal
abspath = os.path.abspath(__file__) abspath = os.path.abspath(__file__)
dname = os.path.dirname(abspath) dname = os.path.dirname(abspath)
@ -49,11 +55,13 @@ main_config.read('./configs/mainconf.ini')
source = main_config.get('DATA', 'SOURCE') source = main_config.get('DATA', 'SOURCE')
if main_config.getboolean('DISCORD', 'ENABLE'): if main_config.getboolean('DISCORD', 'ENABLE'):
from defDiscord import sendDis from defDiscord import sendDis
role_id = main_config.get('DISCORD', 'ROLE_ID') if main_config.has_option('DISCORD', 'ROLE_ID') and main_config.get('DISCORD', 'ROLE_ID').strip() != "" else None
sendDis("Started", main_config, role_id = main_config.get('DISCORD', 'ROLE_ID')) sendDis("Started", main_config, role_id = main_config.get('DISCORD', 'ROLE_ID'))
def service_exit(signum, frame): def service_exit(signum, frame):
if main_config.getboolean('DISCORD', 'ENABLE'): if main_config.getboolean('DISCORD', 'ENABLE'):
from defDiscord import sendDis from defDiscord import sendDis
sendDis("Service Stop", main_config, role_id = main_config.get('DISCORD', 'ROLE_ID')) role_id = main_config.get('DISCORD', 'ROLE_ID') if main_config.has_option('DISCORD', 'ROLE_ID') and main_config.get('DISCORD', 'ROLE_ID').strip() != "" else None
sendDis("Service Stop", main_config, role_id = role_id)
raise SystemExit("Service Stop") raise SystemExit("Service Stop")
signal.signal(signal.SIGTERM, service_exit) signal.signal(signal.SIGTERM, service_exit)
if os.path.isfile("lookup_route.py"): if os.path.isfile("lookup_route.py"):
@ -69,7 +77,7 @@ try:
print("Found the following configs") print("Found the following configs")
for dirpath, dirname, filename in os.walk("./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"]: for filename in [f for f in filename if f.endswith(".ini") and f != "mainconf.ini"]:
if not "disabled" in dirpath: if "disabled" not in dirpath:
print(os.path.join(dirpath, filename)) print(os.path.join(dirpath, filename))
plane_config = configparser.ConfigParser() plane_config = configparser.ConfigParser()
plane_config.read((os.path.join(dirpath, filename))) plane_config.read((os.path.join(dirpath, filename)))

8
defAirport.py

@ -30,6 +30,7 @@ def getClosestAirport(latitude, longitude, allowed_types):
return closest_airport_dict return closest_airport_dict
def get_airport_by_icao(icao): def get_airport_by_icao(icao):
with open('./dependencies/airports.csv', 'r', encoding='utf-8') as airport_csv: with open('./dependencies/airports.csv', 'r', encoding='utf-8') as airport_csv:
matching_airport = None
airport_csv_reader = csv.DictReader(filter(lambda row: row[0]!='#', airport_csv)) airport_csv_reader = csv.DictReader(filter(lambda row: row[0]!='#', airport_csv))
for airport in airport_csv_reader: for airport in airport_csv_reader:
if airport['gps_code'] == icao: if airport['gps_code'] == icao:
@ -37,5 +38,8 @@ def get_airport_by_icao(icao):
#Convert indent key to icao key as its labeled icao in other places not ident #Convert indent key to icao key as its labeled icao in other places not ident
matching_airport['icao'] = matching_airport.pop('gps_code') matching_airport['icao'] = matching_airport.pop('gps_code')
break break
matching_airport = add_airport_region(matching_airport) if matching_airport:
return matching_airport matching_airport = add_airport_region(matching_airport)
return matching_airport
else:
return None

10
defSS.py

@ -8,14 +8,17 @@ from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException from selenium.common.exceptions import NoSuchElementException
def get_adsbx_screenshot(file_path, url_params, enable_labels=False, enable_track_labels=False, overrides={}): def get_adsbx_screenshot(file_path, url_params, enable_labels=False, enable_track_labels=False, overrides={}):
import os
import platform
chrome_options = webdriver.ChromeOptions() chrome_options = webdriver.ChromeOptions()
chrome_options.headless = True chrome_options.headless = True
chrome_options.add_argument('window-size=800,800') chrome_options.add_argument('window-size=800,800')
chrome_options.add_argument('ignore-certificate-errors') chrome_options.add_argument('ignore-certificate-errors')
#Plane images issue loading when in headless setting agent fixes. if platform.system() == "Linux":
chrome_options.add_argument('crash-dumps-dir=/tmp/plane-notify/chrome')
#Plane images issue loading when in headless setting agent fixes.
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.54 Safari/537.36")
import os
import platform
if platform.system() == "Linux" and os.geteuid()==0: if platform.system() == "Linux" and os.geteuid()==0:
chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors. chrome_options.add_argument('--no-sandbox') # required when running as root user. otherwise you would get no sandbox errors.
browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options) browser = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
@ -107,6 +110,7 @@ def get_adsbx_screenshot(file_path, url_params, enable_labels=False, enable_trac
browser.execute_script(f"arguments[0].innerText = '* {overrides['ownop']}'", element) browser.execute_script(f"arguments[0].innerText = '* {overrides['ownop']}'", element)
time.sleep(5) time.sleep(5)
browser.save_screenshot(file_path) browser.save_screenshot(file_path)
browser.quit()
def generate_adsbx_screenshot_time_params(timestamp): def generate_adsbx_screenshot_time_params(timestamp):
from datetime import datetime from datetime import datetime
from datetime import timedelta from datetime import timedelta

9
fuel_calc.py

@ -14,12 +14,11 @@ def get_avg_fuel_price():
except Exception as e: except Exception as e:
print(e) print(e)
return None return None
def fuel_calculation(aircraft_icao_type, minutes): def fuel_calculation(aircraft_icao_type, minutes):
"""Calculates fuel usage, price, c02 output of a flight depending on aircraft type and flight length""" """Calculates fuel usage, price, c02 output of a flight depending on aircraft type and flight length"""
with open("aircraft_type_fuel_consumption_rates.json", "r") as f: with open("aircraft_type_fuel_consumption_rates.json", "r") as f:
fuellist = json.loads(f.read()) fuellist = json.loads(f.read())
#avg_fuel_price_per_gallon = 5.08
fuel_flight_info = {} fuel_flight_info = {}
if aircraft_icao_type in fuellist.keys(): if aircraft_icao_type in fuellist.keys():
avg_fuel_price_per_gallon = get_avg_fuel_price() avg_fuel_price_per_gallon = get_avg_fuel_price()
@ -31,7 +30,7 @@ def fuel_calculation(aircraft_icao_type, minutes):
fuel_flight_info['fuel_used_kg'] = round(fuel_used_kg) fuel_flight_info['fuel_used_kg'] = round(fuel_used_kg)
fuel_flight_info["fuel_used_gal"] = round(fuel_used_gal) fuel_flight_info["fuel_used_gal"] = round(fuel_used_gal)
fuel_flight_info['fuel_used_lters'] = round(fuel_used_gal*3.78541) fuel_flight_info['fuel_used_lters'] = round(fuel_used_gal*3.78541)
fuel_flight_info["fuel_used_lbs"] = round(fuel_used_kg * 2.20462) fuel_flight_info["fuel_used_lbs"] = round(fuel_used_kg * 2.20462)
fuel_flight_info["c02_tons"] = round(c02_tons) if c02_tons > 1 else round(c02_tons, 4) fuel_flight_info["c02_tons"] = round(c02_tons) if c02_tons > 1 else round(c02_tons, 4)
print ("Fuel info", fuel_flight_info) print ("Fuel info", fuel_flight_info)
return fuel_flight_info return fuel_flight_info
@ -43,10 +42,8 @@ def fuel_message(fuel_info):
cost = "{:,}".format(fuel_info['fuel_price']) cost = "{:,}".format(fuel_info['fuel_price'])
gallons = "{:,}".format(fuel_info['fuel_used_gal']) gallons = "{:,}".format(fuel_info['fuel_used_gal'])
lters = "{:,}".format(fuel_info['fuel_used_lters']) lters = "{:,}".format(fuel_info['fuel_used_lters'])
lbs = "{:, }".format(fuel_info['fuel_used_lbs']) lbs = "{:,}".format(fuel_info['fuel_used_lbs'])
kgs = "{:,}".format(fuel_info['fuel_used_kg']) kgs = "{:,}".format(fuel_info['fuel_used_kg'])
fuel_message = f"\n~ {gallons} gallons ({lters} liters). \n~ {lbs} lbs ({kgs} kg) of jet fuel used. \n~ ${cost} cost of fuel. \n~ {fuel_info['c02_tons']} tons of CO2 emissions." fuel_message = f"\n~ {gallons} gallons ({lters} liters). \n~ {lbs} lbs ({kgs} kg) of jet fuel used. \n~ ${cost} cost of fuel. \n~ {fuel_info['c02_tons']} tons of CO2 emissions."
print(fuel_message) print(fuel_message)
return fuel_message return fuel_message
#fuel_info = fuel_calculation("GLF6", 548.1)
#fuel_message(fuel_info)

45
planeClass.py

@ -55,6 +55,7 @@ class Plane:
self.track = None self.track = None
self.last_track = None self.last_track = None
self.circle_history = None self.circle_history = None
self.nearest_from_airport = None
if self.config.has_option('DATA', 'DATA_LOSS_MINS'): if self.config.has_option('DATA', 'DATA_LOSS_MINS'):
self.data_loss_mins = self.config.getint('DATA', 'DATA_LOSS_MINS') self.data_loss_mins = self.config.getint('DATA', 'DATA_LOSS_MINS')
else: else:
@ -222,8 +223,11 @@ class Plane:
def route_format(extra_route_info, type): def route_format(extra_route_info, type):
from defAirport import get_airport_by_icao from defAirport import get_airport_by_icao
to_airport = get_airport_by_icao(self.known_to_airport) to_airport = get_airport_by_icao(self.known_to_airport)
code = to_airport['iata_code'] if to_airport['iata_code'] != "" else to_airport['icao'] if to_airport:
airport_text = f"{code}, {to_airport['name']}" code = to_airport['iata_code'] if to_airport['iata_code'] != "" else to_airport['icao']
airport_text = f"{code}, {to_airport['name']}"
else:
airport_text = f"{self.known_to_airport}"
if 'time_to' in extra_route_info.keys() and type != "divert": if 'time_to' in extra_route_info.keys() and type != "divert":
arrival_rel = "in ~" + extra_route_info['time_to'] arrival_rel = "in ~" + extra_route_info['time_to']
else: else:
@ -235,7 +239,10 @@ class Plane:
header = "Now going to" header = "Now going to"
elif type == "divert": elif type == "divert":
header = "Now diverting to" header = "Now diverting to"
area = f"{to_airport['municipality']}, {to_airport['region']}, {to_airport['iso_country']}" if to_airport:
area = f"{to_airport['municipality']}, {to_airport['region']}, {to_airport['iso_country']}"
else:
area = ""
route_to = f"{header} {area} ({airport_text})" + (f" arriving {arrival_rel}" if arrival_rel is not None else "") route_to = f"{header} {area} ({airport_text})" + (f" arriving {arrival_rel}" if arrival_rel is not None else "")
else: else:
if type == "inital": if type == "inital":
@ -424,12 +431,8 @@ class Plane:
elif self.landed: elif self.landed:
landed_time_msg = None landed_time_msg = None
landed_time = None landed_time = None
if self.icao != "A835AF":
message = (f"{type_header} {location_string}.") + ("" if route_to is None else f" {route_to}.") + ((f" {landed_time_msg}") if landed_time_msg != None else "") message = (f"{type_header} {location_string}.") + ("" if route_to is None else f" {route_to}.") + ((f" {landed_time_msg}") if landed_time_msg != None else "")
dirty_message = None
else:
message = (f"{type_header} {location_string}.") + ((f" {landed_time_msg}") if landed_time_msg != None else "")
dirty_message = (f"{type_header} {location_string}.") + ("" if route_to is None else f" {route_to}.") + ((f" {landed_time_msg}") if landed_time_msg != None else "")
print (message) print (message)
#Google Map or tar1090 screenshot #Google Map or tar1090 screenshot
if Plane.main_config.get('MAP', 'OPTION') == "GOOGLESTATICMAP": if Plane.main_config.get('MAP', 'OPTION') == "GOOGLESTATICMAP":
@ -451,9 +454,8 @@ class Plane:
sendTeleg(photo, message, self.config) sendTeleg(photo, message, self.config)
#Discord #Discord
if self.config.getboolean('DISCORD', 'ENABLE'): if self.config.getboolean('DISCORD', 'ENABLE'):
dis_message = f"{self.dis_title} {message}".strip() if dirty_message is None else f"{self.dis_title} {dirty_message}".strip() role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') and self.config.get('DISCORD', 'ROLE_ID').strip() != "" else None
role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') else None sendDis(message, self.config, role_id, self.map_file_name)
sendDis(dis_message, self.config, role_id, self.map_file_name)
#PushBullet #PushBullet
if self.config.getboolean('PUSHBULLET', 'ENABLE'): if self.config.getboolean('PUSHBULLET', 'ENABLE'):
with open(self.map_file_name, "rb") as pic: with open(self.map_file_name, "rb") as pic:
@ -477,13 +479,13 @@ class Plane:
post_to_meta_both(self.config.get("META", "FB_PAGE_ID"), self.config.get("META", "IG_USER_ID"), self.map_file_name, message, self.config.get("META", "ACCESS_TOKEN")) post_to_meta_both(self.config.get("META", "FB_PAGE_ID"), self.config.get("META", "IG_USER_ID"), self.map_file_name, message, self.config.get("META", "ACCESS_TOKEN"))
os.remove(self.map_file_name) os.remove(self.map_file_name)
if self.landed: if self.landed:
if self.known_to_airport is not None and self.nearest_from_airport is not None and self.known_to_airport != self.nearest_from_airport: if nearest_airport_dict is not None and self.nearest_from_airport is not None and nearest_airport_dict['icao'] != self.nearest_from_airport:
from defAirport import get_airport_by_icao from defAirport import get_airport_by_icao
from geopy.distance import geodesic from geopy.distance import geodesic
known_to_airport = get_airport_by_icao(self.known_to_airport) landed_airport = nearest_airport_dict
nearest_from_airport = get_airport_by_icao(self.nearest_from_airport) nearest_from_airport = get_airport_by_icao(self.nearest_from_airport)
from_coord = (nearest_from_airport['latitude_deg'], nearest_from_airport['longitude_deg']) from_coord = (nearest_from_airport['latitude_deg'], nearest_from_airport['longitude_deg'])
to_coord = (known_to_airport['latitude_deg'], known_to_airport['longitude_deg']) to_coord = (landed_airport['latitude_deg'], landed_airport['longitude_deg'])
distance_mi = float(geodesic(from_coord, to_coord).mi) distance_mi = float(geodesic(from_coord, to_coord).mi)
distance_nm = distance_mi / 1.150779448 distance_nm = distance_mi / 1.150779448
distance_message = f"{'{:,}'.format(round(distance_mi))} mile ({'{:,}'.format(round(distance_nm))} NM) flight from {nearest_from_airport['iata_code'] if nearest_from_airport['iata_code'] != '' else nearest_from_airport['ident']} to {nearest_airport_dict['iata_code'] if nearest_airport_dict['iata_code'] != '' else nearest_airport_dict['ident']}\n" distance_message = f"{'{:,}'.format(round(distance_mi))} mile ({'{:,}'.format(round(distance_nm))} NM) flight from {nearest_from_airport['iata_code'] if nearest_from_airport['iata_code'] != '' else nearest_from_airport['ident']} to {nearest_airport_dict['iata_code'] if nearest_airport_dict['iata_code'] != '' else nearest_airport_dict['ident']}\n"
@ -498,7 +500,7 @@ class Plane:
fuel_message = fuel_message(fuel_info) fuel_message = fuel_message(fuel_info)
if self.config.getboolean('DISCORD', 'ENABLE'): if self.config.getboolean('DISCORD', 'ENABLE'):
dis_message = f"{self.dis_title} {distance_message} \nFlight Fuel Info ```{fuel_message}```".strip() dis_message = f"{self.dis_title} {distance_message} \nFlight Fuel Info ```{fuel_message}```".strip()
role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') else None role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') and self.config.get('DISCORD', 'ROLE_ID').strip() != "" else None
sendDis(dis_message, self.config, role_id) sendDis(dis_message, self.config, role_id)
if self.config.getboolean('TWITTER', 'ENABLE'): if self.config.getboolean('TWITTER', 'ENABLE'):
try: try:
@ -525,11 +527,10 @@ class Plane:
#Discord #Discord
if self.config.getboolean('DISCORD', 'ENABLE'): if self.config.getboolean('DISCORD', 'ENABLE'):
dis_message = f"{self.dis_title} {route_to}".strip() dis_message = f"{self.dis_title} {route_to}".strip()
role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') else None role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') and self.config.get('DISCORD', 'ROLE_ID').strip() != "" else None
sendDis(dis_message, self.config, role_id) sendDis(dis_message, self.config, role_id)
#Twitter #Twitter
if self.config.getboolean('TWITTER', 'ENABLE') and self.icao == 'A835AF': if self.config.getboolean('TWITTER', 'ENABLE'):
#tweet = self.tweet_api.user_timeline(count = 1)[0]
self.latest_tweet_id = self.tweet_api.update_status(status = f"{self.twitter_title} {route_to}".strip(), in_reply_to_status_id = self.latest_tweet_id).id self.latest_tweet_id = self.tweet_api.update_status(status = f"{self.twitter_title} {route_to}".strip(), in_reply_to_status_id = self.latest_tweet_id).id
if self.circle_history is not None: if self.circle_history is not None:
@ -793,8 +794,8 @@ class Plane:
from defTelegram import sendTeleg from defTelegram import sendTeleg
sendTeleg(photo, message, self.config) sendTeleg(photo, message, self.config)
if self.config.getboolean('DISCORD', 'ENABLE'): if self.config.getboolean('DISCORD', 'ENABLE'):
role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') else None role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') and self.config.get('DISCORD', 'ROLE_ID').strip() != "" else None
if tfr_map_filename is not None: if tfr_map_filename is not None:
sendDis(message, self.config, role_id, self.map_file_name, tfr_map_filename) sendDis(message, self.config, role_id, self.map_file_name, tfr_map_filename)
elif tfr_map_filename is None: elif tfr_map_filename is None:
sendDis(message, self.config, role_id, self.map_file_name) sendDis(message, self.config, role_id, self.map_file_name)
@ -865,7 +866,7 @@ class Plane:
if self.config.getboolean('DISCORD', 'ENABLE'): if self.config.getboolean('DISCORD', 'ENABLE'):
from defDiscord import sendDis from defDiscord import sendDis
dis_message = f"{self.dis_title} {ra_message}" dis_message = f"{self.dis_title} {ra_message}"
role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') else None role_id = self.config.get('DISCORD', 'ROLE_ID') if self.config.has_option('DISCORD', 'ROLE_ID') and self.config.get('DISCORD', 'ROLE_ID').strip() != "" else None
sendDis(dis_message, self.config, role_id, self.map_file_name) sendDis(dis_message, self.config, role_id, self.map_file_name)
#if twitter #if twitter
def expire_ra_types(self): def expire_ra_types(self):

Loading…
Cancel
Save