first commit
This commit is contained in:
commit
f1153a4c87
161
colorspot.py
Normal file
161
colorspot.py
Normal 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
|
Loading…
Reference in New Issue
Block a user