From f1153a4c87e059dbcb3aefba284c75452c5ecf79 Mon Sep 17 00:00:00 2001 From: Michael Clemens Date: Wed, 18 May 2022 23:39:02 +0200 Subject: [PATCH] first commit --- README.md | 0 colorspot.py | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 README.md create mode 100644 colorspot.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/colorspot.py b/colorspot.py new file mode 100644 index 0000000..a35a3bc --- /dev/null +++ b/colorspot.py @@ -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