Compare commits
No commits in common. "f5581175ae9caf9a8d7d6daa413d93400071175b" and "5748696970a4b61c569f0a68adcf46935ff79a86" have entirely different histories.
f5581175ae
...
5748696970
|
@ -1,12 +1,13 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# Partially written with ChatGPT
|
# Partially written with ChatGPT
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
import json
|
import json
|
||||||
|
import sqlite3
|
||||||
import argparse
|
import argparse
|
||||||
import requests
|
import requests
|
||||||
import adsms.db
|
|
||||||
import discord_webhook
|
|
||||||
|
|
||||||
|
|
||||||
def load_config(config_file):
|
def load_config(config_file):
|
||||||
|
@ -14,6 +15,24 @@ def load_config(config_file):
|
||||||
return json.load(f)
|
return json.load(f)
|
||||||
|
|
||||||
|
|
||||||
|
def load_database(config):
|
||||||
|
con = sqlite3.connect(config["database"])
|
||||||
|
|
||||||
|
con.execute(
|
||||||
|
"CREATE TABLE IF NOT EXISTS subscriptions(phone VARCHAR, icao VARCHAR, description VARCHAR, last_seen INTEGER)"
|
||||||
|
)
|
||||||
|
con.commit()
|
||||||
|
|
||||||
|
return con
|
||||||
|
|
||||||
|
|
||||||
|
def update_last_seen_time(con, sub_id):
|
||||||
|
con.execute(
|
||||||
|
"UPDATE subscriptions SET last_seen = ? WHERE rowid = ?",
|
||||||
|
(time.time(), sub_id),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def send_text_message(phone, message, key):
|
def send_text_message(phone, message, key):
|
||||||
request = {"phone": phone, "message": message, "key": key}
|
request = {"phone": phone, "message": message, "key": key}
|
||||||
resp = requests.post("https://textbelt.com/text", request)
|
resp = requests.post("https://textbelt.com/text", request)
|
||||||
|
@ -21,38 +40,32 @@ def send_text_message(phone, message, key):
|
||||||
|
|
||||||
|
|
||||||
def process_subscriptions(con, config, data):
|
def process_subscriptions(con, config, data):
|
||||||
subscriptions = db.get_subscriptions(con)
|
cur = con.execute(
|
||||||
print(subscriptions)
|
"SELECT rowid, phone, icao, description, last_seen FROM subscriptions"
|
||||||
for sub_id, phone, icao, description, last_seen, platform in subscriptions:
|
)
|
||||||
|
|
||||||
|
for sub_id, phone, icao, description, last_seen in cur.fetchall():
|
||||||
if icao in data and data[icao]["seen"] < config["max_age"]:
|
if icao in data and data[icao]["seen"] < config["max_age"]:
|
||||||
if last_seen + config["min_disappearance"] < time.time():
|
if last_seen + config["min_disappearance"] < time.time():
|
||||||
message = f"{description}\n{config['tracker']}?icao={icao}"
|
message = f"{description}\n{config['tracker']}?icao={icao}"
|
||||||
|
|
||||||
if platform == "textbelt":
|
send_text_message(phone, message, config["textbelt_key"])
|
||||||
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}")
|
print(f"{phone}: {message}")
|
||||||
|
|
||||||
db.update_last_seen_time(con, sub_id)
|
update_last_seen_time(con, sub_id)
|
||||||
|
|
||||||
con.commit()
|
con.commit()
|
||||||
|
|
||||||
|
|
||||||
def get_current_data(config):
|
def get_current_data(config):
|
||||||
# return {"78007e": {"seen": 0}}
|
|
||||||
response = requests.get(config["data"])
|
response = requests.get(config["data"])
|
||||||
planes = response.json()["aircraft"]
|
planes = response.json()["aircraft"]
|
||||||
return {plane["hex"]: plane for plane in planes}
|
return {plane["hex"]: plane for plane in planes}
|
||||||
|
|
||||||
|
|
||||||
def run(config):
|
def run(config):
|
||||||
con = adsms.db.load_database(config["database"])
|
con = load_database(config)
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
data = get_current_data(config)
|
data = get_current_data(config)
|
||||||
|
|
48
adsms/db.py
48
adsms/db.py
|
@ -1,48 +0,0 @@
|
||||||
import collections
|
|
||||||
import sqlite3
|
|
||||||
import time
|
|
||||||
|
|
||||||
Subscription = collections.namedtuple(
|
|
||||||
"Subscription",
|
|
||||||
[
|
|
||||||
"id",
|
|
||||||
"phone",
|
|
||||||
"icao",
|
|
||||||
"description",
|
|
||||||
"last_seen",
|
|
||||||
"platform",
|
|
||||||
],
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def load_database(file_name):
|
|
||||||
con = sqlite3.connect(file_name)
|
|
||||||
|
|
||||||
cur = con.execute(
|
|
||||||
"CREATE TABLE IF NOT EXISTS subscriptions(phone VARCHAR, icao VARCHAR, description VARCHAR, last_seen INTEGER)"
|
|
||||||
)
|
|
||||||
|
|
||||||
try:
|
|
||||||
cur.execute(
|
|
||||||
"ALTER TABLE subscriptions ADD COLUMN platform DEFAULT 'textbelt'"
|
|
||||||
)
|
|
||||||
except sqlite3.OperationalError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
con.commit()
|
|
||||||
|
|
||||||
return con
|
|
||||||
|
|
||||||
|
|
||||||
def update_last_seen_time(con, sub_id):
|
|
||||||
con.execute(
|
|
||||||
"UPDATE subscriptions SET last_seen = ? WHERE rowid = ?",
|
|
||||||
(time.time(), sub_id),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def get_subscriptions(con):
|
|
||||||
for subscription in con.execute(
|
|
||||||
"SELECT rowid, phone, icao, description, last_seen, platform FROM subscriptions"
|
|
||||||
).fetchall():
|
|
||||||
yield Subscription(*subscription)
|
|
2
debian/adsms-docs.docs
vendored
Normal file
2
debian/adsms-docs.docs
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
README.source
|
||||||
|
README.Debian
|
20
debian/adsms.doc-base.ex
vendored
20
debian/adsms.doc-base.ex
vendored
|
@ -1,10 +1,20 @@
|
||||||
Document: adsms
|
Document: adsms
|
||||||
Title: Debian adsms Manual
|
Title: Debian adsms Manual
|
||||||
Author: Samuel Sloniker <sam@kj7rrv.com>
|
Author: <insert document author here>
|
||||||
Abstract: This manual describes what adsms is
|
Abstract: This manual describes what adsms is
|
||||||
and how it can be used to send SMS notifications
|
and how it can be used to
|
||||||
based on ADS-B data.
|
manage online manuals on Debian systems.
|
||||||
Section: unknown
|
Section: unknown
|
||||||
|
|
||||||
Format: Text
|
Format: debiandoc-sgml
|
||||||
Files: /usr/share/doc/adsms/README.md
|
Files: /usr/share/doc/adsms/adsms.sgml.gz
|
||||||
|
|
||||||
|
Format: postscript
|
||||||
|
Files: /usr/share/doc/adsms/adsms.ps.gz
|
||||||
|
|
||||||
|
Format: text
|
||||||
|
Files: /usr/share/doc/adsms/adsms.text.gz
|
||||||
|
|
||||||
|
Format: HTML
|
||||||
|
Index: /usr/share/doc/adsms/html/index.html
|
||||||
|
Files: /usr/share/doc/adsms/html/*.html
|
||||||
|
|
|
@ -10,4 +10,3 @@ py.install_sources(
|
||||||
install_data('run_adsms.py', install_dir: get_option('bindir'), rename: 'adsms')
|
install_data('run_adsms.py', install_dir: get_option('bindir'), rename: 'adsms')
|
||||||
install_data('adsms.service', install_dir: 'lib/systemd/system')
|
install_data('adsms.service', install_dir: 'lib/systemd/system')
|
||||||
install_data('example_config.json', install_dir: 'etc', rename: 'adsms.json')
|
install_data('example_config.json', install_dir: 'etc', rename: 'adsms.json')
|
||||||
install_data('README.md', install_dir: 'usr/share/doc/adsms/')
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ classifiers = [
|
||||||
"Development Status :: 2 - Pre-Alpha",
|
"Development Status :: 2 - Pre-Alpha",
|
||||||
"License :: OSI Approved :: GNU Affero General Public License v3",
|
"License :: OSI Approved :: GNU Affero General Public License v3",
|
||||||
]
|
]
|
||||||
dependencies = ["requests", "discord-webhook"]
|
dependencies = ["requests"]
|
||||||
requires-python = ">=3.7"
|
requires-python = ">=3.7"
|
||||||
|
|
||||||
[project.urls]
|
[project.urls]
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
requests
|
requests
|
||||||
discord-webhook
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user