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.
107 lines
2.6 KiB
107 lines
2.6 KiB
# Partially written with ChatGPT |
|
|
|
import os |
|
import time |
|
import json |
|
import argparse |
|
import requests |
|
import adsms.db |
|
import discord_webhook |
|
|
|
|
|
def load_config(config_file): |
|
with open(config_file) as f: |
|
return json.load(f) |
|
|
|
|
|
def send_text_message(phone, message, key): |
|
request = {"phone": phone, "message": message, "key": key} |
|
resp = requests.post("https://textbelt.com/text", request) |
|
print(resp.json()) |
|
|
|
|
|
def process_subscriptions(con, config, data): |
|
subscriptions = db.get_subscriptions(con) |
|
|
|
for ( |
|
sub_id, |
|
phone, |
|
icao, |
|
description, |
|
last_seen, |
|
platform, |
|
min_lat, |
|
min_lon, |
|
max_lat, |
|
max_lon, |
|
) in subscriptions: |
|
if ( |
|
icao in data |
|
and data[icao]["seen_pos"] < config["max_age"] |
|
and min_lat <= data[icao]["lat"] <= max_lat |
|
and min_lon <= data[icao]["lon"] <= max_lon |
|
): |
|
if last_seen + config["min_disappearance"] < time.time(): |
|
message = f"{description}\n{config['tracker']}?icao={icao}" |
|
|
|
if platform == "textbelt": |
|
send_text_message(phone, message, config["textbelt_key"]) |
|
elif platform == "discord_webhook": |
|
print( |
|
discord_webhook.DiscordWebhook( |
|
url=phone, content=message |
|
).execute() |
|
) |
|
|
|
print(f"{phone}: {message}") |
|
|
|
db.update_last_seen_time(con, sub_id) |
|
|
|
con.commit() |
|
|
|
|
|
def get_current_data(con, config): |
|
# return {"78007e": {"seen": 0}} |
|
print( |
|
config["data"] |
|
+ (",".join(db.get_all_icao(con)) if config["codes"] else "") |
|
) |
|
response = requests.get( |
|
config["data"] |
|
+ (",".join(db.get_all_icao(con)) if config["codes"] else "") |
|
).json() |
|
planes = response.get("aircraft", response["ac"]) |
|
return {plane["hex"]: plane for plane in planes} |
|
|
|
|
|
def run(config): |
|
con = adsms.db.load_database(config["database"]) |
|
|
|
print(db.get_all_icao(con)) |
|
|
|
while True: |
|
data = get_current_data(con, config) |
|
|
|
process_subscriptions(con, config, data) |
|
|
|
time.sleep(config["delay"]) |
|
|
|
con.close() |
|
|
|
|
|
def main(): |
|
parser = argparse.ArgumentParser() |
|
parser.add_argument("config_file") |
|
args = parser.parse_args() |
|
|
|
config = load_config(args.config_file) |
|
|
|
try: |
|
if config["pid_file"]: |
|
with open(config["pid_file"], "w+") as f: |
|
f.write(str(os.getpid())) |
|
|
|
run(config) |
|
finally: |
|
if config["pid_file"]: |
|
os.unlink(config["pid_file"])
|
|
|