Compare commits

..

No commits in common. "f5581175ae9caf9a8d7d6daa413d93400071175b" and "5748696970a4b61c569f0a68adcf46935ff79a86" have entirely different histories.

7 changed files with 47 additions and 72 deletions

View File

@ -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)

View File

@ -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
View File

@ -0,0 +1,2 @@
README.source
README.Debian

View File

@ -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

View File

@ -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/')

View File

@ -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]

View File

@ -1,2 +1 @@
requests requests
discord-webhook