first commit

This commit is contained in:
Michael Clemens 2022-05-18 23:39:02 +02:00
commit f1153a4c87
2 changed files with 161 additions and 0 deletions

0
README.md Normal file
View File

161
colorspot.py Normal file
View File

@ -0,0 +1,161 @@
import sys
import csv
import re
import json
import os
from telnetlib import Telnet
from colored import fg, bg, attr
import configparser
class ColorSpot():
def __init__(self):
self.version = "0.1.0"
self.config = configparser.ConfigParser()
self.config_file = os.path.expanduser('~/.colorspot.ini')
self.read_config(self.config, self.config_file)
self.country_data = {}
#TODO: download file and/or tell user what to do
with open('cty.json', "r") as json_file:
self.country_data = json.load(json_file)
self.qsl_countries = self.get_confirmed_countries()
@staticmethod
def read_config(config, file_name):
"""reads the configuration from the config file or
creates a default config file if none could be found"""
if os.path.isfile(file_name):
config.read(file_name)
else:
config = configparser.ConfigParser()
config['cluster'] = {
'host': 'dxc.nc7j.com',
'port': '7373',
'timeout': '100'}
config['colors'] = {
'use_colors': 'yes',
"145": "white",
"144": "white",
"50": "white",
"29": "yellow",
"28": "yellow",
"24": "red",
"21": "orchid",
"18": "green",
"14": "steel_blue_3",
"10": "orange_1",
"7": "cyan",
"5": "white",
"3": "light_cyan",
"1": "white",
'alert_bg': 'indian_red_1a',
'alert_fg': 'white',
'default_bg': 'black'}
with open(file_name, 'w') as configfile:
config.write(configfile)
print("\nNo configuration file found. A new configuration file has been created.")
print("\nPlease edit the file " + file_name + " and restart the application.\n" )
sys.exit()
return config
@staticmethod
def get_confirmed_countries():
ret = []
#TODO: download file and/or tell user what to do
file = open("lotwreport.adi", "r")
for row in file:
if re.search("COUNTRY", row):
country = row.partition(">")[2].lower().rstrip()
if country not in ret:
ret.append(country)
return ret
@staticmethod
def check_lotw(call):
ret = ""
#TODO: download file and/or tell user what to do
csv_file = csv.reader(open('lotw-user-activity.csv', "r"), delimiter=",")
#loop through the csv file
for row in csv_file:
if call == row[0]:
ret = row[1]
return ret
return ret
@staticmethod
def get_country(call, data):
done = False
while not done:
for number in data:
for country in data[number]:
if call == country["prefix"]:
return country["areaname"]
call = call[:-1]
return None
def get_spots(self):
with Telnet(self.config['cluster']['host'], int(self.config['cluster']['port']), \
int(self.config['cluster']['timeout'])) as telnet:
while True:
line_enc = telnet.read_until(b"\n") # Read one line
line = line_enc.decode('ascii')
if "enter your call" in line:
my_str_as_bytes = str.encode(self.config['cluster']['user']+"\n")
telnet.write(my_str_as_bytes)
elif "DX de" in line:
try:
band_col = ""
call_de = re.search('DX de (.+?): ', line).group(1)
freq = re.search(': +(.+?) ', line).group(1)
call_dx = re.search(freq + ' +(.+?) ', line).group(1)
time = re.search('[^ ]*$', line).group(0)[0:4]
comment = re.search(call_dx + ' +(.+?) +' + time, line).group(1)
areaname = self.get_country(call_dx, self.country_data)
lotw_date = self.check_lotw(call_dx)
lotw = ""
if lotw_date:
lotw = "[LotW] "
try:
band_col = self.config['colors'][freq[:-5]]
except Exception:
band_col = "white"
freq = freq.replace('.0', '')
if areaname.lower() not in self.qsl_countries:
background = self.config['colors']['alert_bg']
band_col = self.config['colors']['alert_fg']
else:
background = self.config['colors']['default_bg']
sep = fg("grey_27")+'|'+fg(band_col)
row = [call_de, sep, freq, sep, call_dx, \
sep, areaname, sep, lotw + comment, sep, time]
print(bg(background) + fg(band_col) + \
'{:9.9} {:<1} {:>7.7} {:<1} {:<10.10} {:<1} {:<16.16} {:<1} {:<30.30} {:<1} {:<4.4}'.format(*row) + attr("reset"))
except AttributeError:
print(line)
elif "login: " in line:
print(line)
#####################################################
# Main Routine #
#####################################################
def main():
"""the main routine"""
color_spot = ColorSpot()
color_spot.get_spots()
if __name__ == "__main__":
try:
sys.exit(main())
except EOFError:
pass