#!/usr/bin/env python3 # Infos on colors: https://pypi.org/project/colored/ # Country list extracted from http://www.arrl.org/files/file/dxcclist.txt import sys import csv import re import json import os import time as bla from telnetlib import Telnet from colored import fg, bg, attr import configparser from collections import defaultdict import random 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.qsl_countries = self.get_confirmed_countries() self.print_banner() @staticmethod def rnd_col(): r = lambda: random.randint(0,255) return'#%02X%02X%02X' % (r(),r(),r()) def print_banner(self): """print an awesome banner""" ver = self.version # print the banner print(fg(self.rnd_col())+" ___ _ ___ _ ") print(fg(self.rnd_col())+" / __|___| |___ _ _/ __|_ __ ___| |_ ") print(fg(self.rnd_col())+" | (__/ _ \ / _ \ '_\__ \ '_ \/ _ \ _|") print(fg(self.rnd_col())+" \___\___/_\___/_| |___/ .__/\___/\__|") print(fg(self.rnd_col())+" -= DK1MI =- |_| ") print(attr('reset')) @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', 'user': 'N0CALL', 'timeout': '100'} config['lotw'] = { 'user': 'N0CALL', 'password': 'XXXXXXXXX', 'mode': 'ssb'} config['band_colors'] = { "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'} config['cont_colors'] = { "AF": "light_salmon_3b", "AN": "white", "AS": "orange_red_1", "EU": "cyan", "NA": "steel_blue_3", "OC": "orchid", "SA": "light_goldenrod_2a"} config['colors']= { 'use_colors': 'yes', 'color_by' : 'continent', 'alert_bg': 'indian_red_1a', 'alert_fg': 'white', 'default_bg': 'black'} config['dxcc'] = { "1A": "Sov. Mil. Order of Malta,EU", "3A": "Monaco,EU", "3B6": "Agalega & St. Brandon Is.,AF", "3B7": "Agalega & St. Brandon Is.,AF", "3B8": "Mauritius,AF", "3B9": "Rodriguez I.,AF", "3C": "Equatorial Guinea,AF", "3C0": "Annobon I.,AF", "3D2": "Fiji,OC", "3D2": "Conway Reef,OC", "3D2": "Rotuma I.,OC", "3DA": "Swaziland,AF", "3V": "Tunisia,AF", "3W": "Viet Nam,AS", "XV": "Viet Nam,AS", "3X": "Guinea,AF", "3Y": "Bouvet,AF", "3Y": "Peter I I.,AN", "4J": "Azerbaijan,AS", "4K": "Azerbaijan,AS", "4L": "Georgia,AS", "4O": "Montenegro,EU", "4S": "Sri Lanka,AS", "4U_ITU": "ITU HQ,EU", "4U_UN": "United Nations HQ,NA", "4W": "Timor - Leste,OC", "4X": "Israel,AS", "4Z": "Israel,AS", "5A": "Libya,AF", "5B": "Cyprus,AS", "C4": "Cyprus,AS", "P3": "Cyprus,AS", "5H": "Tanzania,AF", "5I": "Tanzania,AF", "5N": "Nigeria,AF", "5R": "Madagascar,AF", "5T": "Mauritania,AF", "5U": "Niger,AF", "5V": "Togo,AF", "5W": "Samoa,OC", "5X": "Uganda,AF", "5Y": "Kenya,AF", "5Z": "Kenya,AF", "6V": "Senegal,AF", "6W": "Senegal,AF", "6Y": "Jamaica,NA", "7O": "Yemen,AS", "7P": "Lesotho,AF", "7Q": "Malawi,AF", "7T": "Algeria,AF", "7U": "Algeria,AF", "7V": "Algeria,AF", "7W": "Algeria,AF", "7X": "Algeria,AF", "7Y": "Algeria,AF", "8P": "Barbados,NA", "8Q": "Maldives,AF", "8R": "Guyana,SA", "9A": "Croatia,EU", "9G": "Ghana,AF", "9H": "Malta,EU", "9I": "Zambia,AF", "9J": "Zambia,AF", "9K": "Kuwait,AS", "9L": "Sierra Leone,AF", "9M2": "West Malaysia,AS", "9M4": "West Malaysia,AS", "9M6": "East Malaysia,OC", "9M8": "East Malaysia,OC", "9N": "Nepal,AS", "9Q": "Dem. Rep. of Congo,AF", "9R": "Dem. Rep. of Congo,AF", "9S": "Dem. Rep. of Congo,AF", "9T": "Dem. Rep. of Congo,AF", "9U": "Burundi,AF", "9V": "Singapore,AS", "9X": "Rwanda,AF", "9Y": "Trinidad & Tobago,SA", "9Z": "Trinidad & Tobago,SA", "A2": "Botswana,AF", "A3": "Tonga,OC", "A4": "Oman,AS", "A5": "Bhutan,AS", "A6": "United Arab Emirates,AS", "A7": "Qatar,AS", "A9": "Bahrain,AS", "AP": "Pakistan,AS", "B": "China,AS", "BS7": "Scarborough Reef,AS", "BV": "Taiwan,AS", "BV9P": "Pratas I.,AS", "C2": "Nauru,OC", "C3": "Andorra,EU", "C5": "The Gambia,AF", "C6": "Bahamas,NA", "C8": "Mozambique,AF", "C9": "Mozambique,AF", "CA": "Chile,SA", "CB": "Chile,SA", "CC": "Chile,SA", "CD": "Chile,SA", "CE": "Chile,SA", "CE0": "Easter I.,SA", "CE0": "Juan Fernandez Is.,SA", "CE0": "San Felix & San Ambrosio,SA", "CE9": "Antarctica,AN", "KC4": "Antarctica,AN", "3Y": "Antarctica,AN", "8j1": "Antarctica,AN", "AT0": "Antarctica,AN", "DP0": "Antarctica,AN", "VK0": "Antarctica,AN", "VP8": "Antarctica,AN", "R1AW": "Antarctica,AN", "CM": "Cuba,NA", "CO": "Cuba,NA", "CN": "Morocco,AF", "CP": "Bolivia,SA", "CT": "Portugal,EU", "CT3": "Madeira Is.,AF", "CU": "Azores,EU", "CV": "Uruguay,SA", "CW": "Uruguay,SA", "CX": "Uruguay,SA", "CY0": "Sable I.,NA", "CY9": "St. Paul I.,NA", "D2": "Angola,AF", "D3": "Angola,AF", "D4": "Cape Verde,AF", "D6": "Comoros,AF", "DA": "Federal Republic of Germany,EU", "DB": "Federal Republic of Germany,EU", "DC": "Federal Republic of Germany,EU", "DD": "Federal Republic of Germany,EU", "DE": "Federal Republic of Germany,EU", "DF": "Federal Republic of Germany,EU", "DG": "Federal Republic of Germany,EU", "DH": "Federal Republic of Germany,EU", "DI": "Federal Republic of Germany,EU", "DJ": "Federal Republic of Germany,EU", "DK": "Federal Republic of Germany,EU", "DL": "Federal Republic of Germany,EU", "DM": "Federal Republic of Germany,EU", "DN": "Federal Republic of Germany,EU", "DO": "Federal Republic of Germany,EU", "DP": "Federal Republic of Germany,EU", "DQ": "Federal Republic of Germany,EU", "DR": "Federal Republic of Germany,EU", "DU": "Philippines,OC", "DV": "Philippines,OC", "DW": "Philippines,OC", "DX": "Philippines,OC", "DY": "Philippines,OC", "DZ": "Philippines,OC", "E3": "Eritrea,AF", "E4": "Palestine,AS", "E5": "N. Cook Is.,OC", "E5": "S. Cook Is.,OC", "E7": "Bosnia-Herzegovina,EU", "EA": "Spain,EU", "EB": "Spain,EU", "EC": "Spain,EU", "ED": "Spain,EU", "EE": "Spain,EU", "EF": "Spain,EU", "EG": "Spain,EU", "EH": "Spain,EU", "EA6": "Balearic Is.,EU", "EB6": "Balearic Is.,EU", "EC6": "Balearic Is.,EU", "ED6": "Balearic Is.,EU", "EE6": "Balearic Is.,EU", "EF6": "Balearic Is.,EU", "EG6": "Balearic Is.,EU", "EH6": "Balearic Is.,EU", "EA8": "Canary Is.,AF", "EB8": "Canary Is.,AF", "EC8": "Canary Is.,AF", "ED8": "Canary Is.,AF", "EE8": "Canary Is.,AF", "EF8": "Canary Is.,AF", "EG8": "Canary Is.,AF", "EH8": "Canary Is.,AF", "EA9": "Ceuta & Melilla,AF", "EB9": "Ceuta & Melilla,AF", "EC9": "Ceuta & Melilla,AF", "ED9": "Ceuta & Melilla,AF", "EE9": "Ceuta & Melilla,AF", "EF9": "Ceuta & Melilla,AF", "EG9": "Ceuta & Melilla,AF", "EH9": "Ceuta & Melilla,AF", "EI": "Ireland,EU", "EJ": "Ireland,EU", "EK": "Armenia,AS", "EL": "Liberia,AF", "EP": "Iran,AS", "EQ": "Iran,AS", "ER": "Moldova,EU", "ES": "Estonia,EU", "ET": "Ethiopia,AF", "EU": "Belarus,EU", "EV": "Belarus,EU", "EW": "Belarus,EU", "EX": "Kyrgyzstan,AS", "EY": "Tajikistan,AS", "EZ": "Turkmenistan,AS", "F": "France,EU", "FG": "Guadeloupe,NA", "FH": "Mayotte,AF", "FJ": "Saint Barthelemy,NA", "FK": "New Caledonia,OC", "FK": "Chesterfield Is.,OC", "FM": "Martinique,NA", "FO": "Austral I.,OC", "FO": "Clipperton I.,NA", "FO": "French Polynesia,OC", "FO": "Marquesas Is.,OC", "FP": "St. Pierre & Miquelon,NA", "FR/G": "Glorioso Is.,AF", "FR/J": "Juan de Nova, Europa,AF", "FR/E": "Juan de Nova, Europa,AF", "FR": "Reunion I.,AF", "FR/T": "Tromelin I.,AF", "FS": "Saint Martin,NA", "FT/W": "Crozet I.,AF", "FT/X": "Kerguelen Is.,AF", "FT/Z": "Amsterdam & St. Paul Is.,AF", "FW": "Wallis & Futuna Is.,OC", "FY": "French Guiana,SA", "G": "England,EU", "GX": "England,EU", "M": "England,EU", "GD": "Isle of Man,EU", "GT": "Isle of Man,EU", "GI": "Northern Ireland,EU", "GN": "Northern Ireland,EU", "GJ": "Jersey,EU", "GH": "Jersey,EU", "GM": "Scotland,EU", "GS": "Scotland,EU", "GU": "Guernsey,EU", "GP": "Guernsey,EU", "GW": "Wales,EU", "GC": "Wales,EU", "H4": "Solomon Is.,OC", "H40": "Temotu Province,OC", "HA": "Hungary,EU", "HG": "Hungary,EU", "HB": "Switzerland,EU", "HB0": "Liechtenstein,EU", "HC": "Ecuador,SA", "HD": "Ecuador,SA", "HC8": "Galapagos Is.,SA", "HD8": "Galapagos Is.,SA", "HH": "Haiti,NA", "HI": "Dominican Republic,NA", "HJ": "Colombia,SA", "HK": "Colombia,SA", "5J": "Colombia,SA", "5K": "Colombia,SA", "HK0": "Malpelo I.,SA", "HK0": "San Andres & Providencia,NA", "HL": "Republic of Korea,AS", "6K": "Republic of Korea,AS", "6N": "Republic of Korea,AS", "HO": "Panama,NA", "HP": "Panama,NA", "HQ": "Honduras,NA", "HR": "Honduras,NA", "HS": "Thailand,AS", "E2": "Thailand,AS", "HV": "Vatican,EU", "HZ": "Saudi Arabia,AS", "I": "Italy,EU", "IS0": "Sardinia,EU", "IM0": "Sardinia,EU", "J2": "Djibouti,AF", "J3": "Grenada,NA", "J5": "Guinea-Bissau,AF", "J6": "St. Lucia,NA", "J7": "Dominica,NA", "J8": "St. Vincent,NA", "JA": "Japan,AS", "JB": "Japan,AS", "JC": "Japan,AS", "JD": "Japan,AS", "JE": "Japan,AS", "JF": "Japan,AS", "JG": "Japan,AS", "JH": "Japan,AS", "JI": "Japan,AS", "JJ": "Japan,AS", "JK": "Japan,AS", "JL": "Japan,AS", "JM": "Japan,AS", "JN": "Japan,AS", "JO": "Japan,AS", "JP": "Japan,AS", "JQ": "Japan,AS", "JR": "Japan,AS", "JS": "Japan,AS", "7J": "Japan,AS", "7K": "Japan,AS", "7L": "Japan,AS", "7M": "Japan,AS", "7N": "Japan,AS", "JD1": "Minami Torishima,OC", "JD1": "Ogasawara,AS", "JT": "Mongolia,AS", "JU": "Mongolia,AS", "JV": "Mongolia,AS", "JW": "Svalbard,EU", "JX": "Jan Mayen,EU", "JY": "Jordan,AS", "K": "United States of America,NA", "W": "United States of America,NA", "N": "United States of America,NA", "AA": "United States of America,NA", "AB": "United States of America,NA", "AC": "United States of America,NA", "AD": "United States of America,NA", "AE": "United States of America,NA", "AF": "United States of America,NA", "AG": "United States of America,NA", "AH": "United States of America,NA", "AI": "United States of America,NA", "AJ": "United States of America,NA", "AK": "United States of America,NA", "KG4": "Guantanamo Bay,NA", "KH0": "Mariana Is.,OC", "KH1": "Baker & Howland Is.,OC", "KH2": "Guam,OC", "KH3": "Johnston I.,OC", "KH4": "Midway I.,OC", "KH5": "Palmyra & Jarvis Is.,OC", "KH5K": "Kingman Reef,OC", "KH6": "Hawaii,OC", "KH7": "Hawaii,OC", "KH7K": "Kure I.,OC", "KH8": "American Samoa,OC", "KH8": "Swains I.,OC", "KH9": "Wake I.,OC", "KL": "Alaska,NA", "AL": "Alaska,NA", "NL": "Alaska,NA", "WL": "Alaska,NA", "KP1": "Navassa I.,NA", "KP2": "Virgin Is.,NA", "KP3": "Puerto Rico,NA", "KP4": "Puerto Rico,NA", "KP5": "Desecheo I.,NA", "LA": "Norway,EU", "LB": "Norway,EU", "LC": "Norway,EU", "LD": "Norway,EU", "LE": "Norway,EU", "LF": "Norway,EU", "LG": "Norway,EU", "LH": "Norway,EU", "LI": "Norway,EU", "LJ": "Norway,EU", "LK": "Norway,EU", "LL": "Norway,EU", "LM": "Norway,EU", "LN": "Norway,EU", "LO": "Argentina,SA", "LP": "Argentina,SA", "LQ": "Argentina,SA", "LR": "Argentina,SA", "LS": "Argentina,SA", "LT": "Argentina,SA", "LU": "Argentina,SA", "LV": "Argentina,SA", "LW": "Argentina,SA", "LX": "Luxembourg,EU", "LY": "Lithuania,EU", "LZ": "Bulgaria,EU", "OA": "Peru,SA", "OB": "Peru,SA", "OC": "Peru,SA", "OD": "Lebanon,AS", "OE": "Austria,EU", "OF": "Finland,EU", "OG": "Finland,EU", "OH": "Finland,EU", "OI": "Finland,EU", "OH0": "Aland Is.,EU", "OJ0": "Market Reef,EU", "OK": "Czech Republic,EU", "OL": "Czech Republic,EU", "OM": "Slovak Republic,EU", "ON": "Belgium,EU", "OO": "Belgium,EU", "OP": "Belgium,EU", "OQ": "Belgium,EU", "OR": "Belgium,EU", "OS": "Belgium,EU", "OT": "Belgium,EU", "OU": "Denmark,EU", "OV": "Denmark,EU", "OW": "Denmark,EU", "OZ": "Denmark,EU", "OX": "Greenland,NA", "OY": "Faroe Is.,EU", "P2": "Papua New Guinea,OC", "P4": "Aruba,SA", "P5": "DPR of Korea,AS", "PA": "Netherlands,EU", "PB": "Netherlands,EU", "PC": "Netherlands,EU", "PD": "Netherlands,EU", "PE": "Netherlands,EU", "PF": "Netherlands,EU", "PG": "Netherlands,EU", "PH": "Netherlands,EU", "PI": "Netherlands,EU", "PJ2": "Bonaire, Curacao,SA", "PJ4": "Bonaire, Curacao,SA", "PJ9": "Bonaire, Curacao,SA", "PJ5": "St. Maarten, Saba, St.Eustatius,NA", "PJ6": "St. Maarten, Saba, St.Eustatius,NA", "PJ7": "St. Maarten, Saba, St.Eustatius,NA", "PJ8": "St. Maarten, Saba, St.Eustatius,NA", "PP": "Brazil,SA", "PQ": "Brazil,SA", "PR": "Brazil,SA", "PS": "Brazil,SA", "PT": "Brazil,SA", "PU": "Brazil,SA", "PV": "Brazil,SA", "PW": "Brazil,SA", "PX": "Brazil,SA", "PY": "Brazil,SA", "PP0-PY0F": "Fernando de Noronha,SA", "PP0-PY0S": "St. Peter & St. Paul Rocks,SA", "PP0-PY0T": "Trindade & Martim Vaz Is.,SA", "PZ": "Suriname,SA", "R1FJ": "Franz Josef Land,EU", "R1MV": "Malyj Vysotskij I.,EU", "S0": "Western Sahara,AF", "S2": "Bangladesh,AS", "S5": "Slovenia,EU", "S7": "Seychelles,AF", "S9": "Sao Tome & Principe,AF", "SA": "Sweden,EU", "SB": "Sweden,EU", "SC": "Sweden,EU", "SD": "Sweden,EU", "SE": "Sweden,EU", "SF": "Sweden,EU", "SG": "Sweden,EU", "SH": "Sweden,EU", "SI": "Sweden,EU", "SJ": "Sweden,EU", "SK": "Sweden,EU", "SL": "Sweden,EU", "SM": "Sweden,EU", "SN": "Poland,EU", "SO": "Poland,EU", "SP": "Poland,EU", "SQ": "Poland,EU", "SR": "Poland,EU", "ST": "Sudan,AF", "SU": "Egypt,AF", "SV": "Greece,EU", "SW": "Greece,EU", "SX": "Greece,EU", "SY": "Greece,EU", "SZ": "Greece,EU", "J4": "Greece,EU", "SV/A": "Mount Athos,EU", "SV5": "Dodecanese,EU", "J45": "Dodecanese,EU", "SV9": "Crete,EU", "J49": "Crete,EU", "T2": "Tuvalu,OC", "T30": "W. Kiribati,OC", "T31": "C. Kiribati (British Phoenix Is.),OC", "T32": "E. Kiribati,OC", "T33": "Banaba I.,OC", "T5": "Somalia,AF", "6O": "Somalia,AF", "T7": "San Marino,EU", "T8": "Palau,OC", "TA": "Turkey,EU", "TB": "Turkey,EU", "TC": "Turkey,EU", "TF": "Iceland,EU", "TG": "Guatemala,NA", "TD": "Guatemala,NA", "TI": "Costa Rica,NA", "TE": "Costa Rica,NA", "TI9": "Cocos I.,NA", "TJ": "Cameroon,AF", "TK": "Corsica,EU", "TL": "Central Africa,AF", "TN": "???,AF", "TR": "Gabon,AF", "TT": "Chad,AF", "TU": "Cote d Ivoire,AF", "TY": "Benin,AF", "TZ": "Mali,AF", "UA": "Russia,EU", "UB": "Russia,EU", "UC": "Russia,EU", "UD": "Russia,EU", "UE": "Russia,EU", "UF": "Russia,EU", "UG": "Russia,EU", "UH": "Russia,EU", "UI": "Russia,EU", "R": "Russia,EU", "UA2": "Kaliningrad,EU", "UJ": "Uzbekistan,AS", "UK": "Uzbekistan,AS", "UL": "Uzbekistan,AS", "UM": "Uzbekistan,AS", "UN": "Kazakhstan,AS", "UO": "Kazakhstan,AS", "UP": "Kazakhstan,AS", "UQ": "Kazakhstan,AS", "UR": "Ukraine,EU", "US": "Ukraine,EU", "UT": "Ukraine,EU", "UU": "Ukraine,EU", "UV": "Ukraine,EU", "UW": "Ukraine,EU", "UX": "Ukraine,EU", "UY": "Ukraine,EU", "UZ": "Ukraine,EU", "EM": "Ukraine,EU", "EN": "Ukraine,EU", "EO": "Ukraine,EU", "V2": "Antigua & Barbuda,NA", "V3": "Belize,NA", "V4": "St. Kitts & Nevis,NA", "V5": "Namibia,AF", "V6": "Micronesia,OC", "V7": "Marshall Is.,OC", "V8": "Brunei Darussalam,OC", "VE": "Canada,NA", "VO": "Canada,NA", "VY": "Canada,NA", "VK": "Australia,OC", "VK0": "Heard I.,AF", "VK0": "Macquarie I.,OC", "VK9C": "Cocos Is.,OC", "VK9L": "Lord Howe I.,OC", "VK9M": "Mellish Reef,OC", "VK9N": "Norfolk I.,OC", "VK9W": "Willis I.,OC", "VK9X": "Christmas I.,OC", "VP2E": "Anguilla,NA", "VP2M": "Montserrat,NA", "VP2V": "British Virgin Is.,NA", "VP5": "Turks & Caicos Is.,NA", "VP6": "Pitcairn I.,OC", "VP6": "Ducie I.,OC", "VP8": "Falkland Is.,SA", "VP8": "South Shetland Is.,SA", "CE9": "South Shetland Is.,SA", "HF0": "South Shetland Is.,SA", "4K1": "South Shetland Is.,SA", "VP9": "Bermuda,NA", "VQ9": "Chagos Is.,AF", "VR": "Hong Kong,AS", "VU": "India,AS", "VU4": "Andaman & Nicobar Is.,AS", "VU7": "Lakshadweep Is.,AS", "XA": "Mexico,NA", "XB": "Mexico,NA", "XC": "Mexico,NA", "XD": "Mexico,NA", "XE": "Mexico,NA", "XF": "Mexico,NA", "XG": "Mexico,NA", "XH": "Mexico,NA", "XI": "Mexico,NA", "XA4": "Revillagigedo,NA", "XB4": "Revillagigedo,NA", "XC4": "Revillagigedo,NA", "XD4": "Revillagigedo,NA", "XE4": "Revillagigedo,NA", "XF4": "Revillagigedo,NA", "XG4": "Revillagigedo,NA", "XH4": "Revillagigedo,NA", "XI4": "Revillagigedo,NA", "XT": "Burkina Faso,AF", "XU": "Cambodia,AS", "XW": "Laos,AS", "XX9": "Macao,AS", "XY": "Myanmar,AS", "XZ": "Myanmar,AS", "YA": "Afghanistan,AS", "YB": "Indonesia,OC", "YC": "Indonesia,OC", "YD": "Indonesia,OC", "YE": "Indonesia,OC", "YF": "Indonesia,OC", "YG": "Indonesia,OC", "YH": "Indonesia,OC", "YI": "Iraq,AS", "YJ": "Vanuatu,OC", "YK": "Syria,AS", "YL": "Latvia,EU", "YN": "Nicaragua,NA", "H6": "Nicaragua,NA", "H7": "Nicaragua,NA", "HT": "Nicaragua,NA", "YO": "Romania,EU", "YP": "Romania,EU", "YQ": "Romania,EU", "YR": "Romania,EU", "YS": "El Salvador,NA", "HU": "El Salvador,NA", "YT": "Serbia,EU", "YU": "Serbia,EU", "YV": "Venezuela,SA", "YW": "Venezuela,SA", "YX": "Venezuela,SA", "YY": "Venezuela,SA", "4M": "Venezuela,SA", "YV0": "Aves I.,NA", "Z2": "Zimbabwe,AF", "Z3": "Macedonia,EU", "ZA": "Albania,EU", "ZB2": "Gibraltar,EU", "ZC4": "UK Sov. Base Areas on Cyprus,AS", "ZD7": "St. Helena,AF", "ZD8": "Ascension I.,AF", "ZD9": "Tristan da Cunha & Gough I.,AF", "ZF": "Cayman Is.,NA", "ZK2": "Niue,OC", "ZK3": "Tokelau Is.,OC", "ZL": "New Zealand,OC", "ZM": "New Zealand,OC", "ZL7": "Chatham Is.,OC", "ZL8": "Kermadec Is.,OC", "ZL9": "Auckland & Campbell Is.,OC", "ZP": "Paraguay,SA", "ZR": "South Africa,AF", "ZS": "South Africa,AF", "ZT": "South Africa,AF", "ZU": "South Africa,AF", "ZS8": "Prince Edward & Marion Is.,AF" } 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 def get_confirmed_countries(self): ret = [] #TODO: download file and/or tell user what to do file = open("lotw.adi", "r") for row in file: if re.search("COUNTRY", row): country = row.partition(">")[2].lower().rstrip() country = re.sub('European ', '', country, flags=re.IGNORECASE) country = re.sub('Asiatic ', '', country, flags=re.IGNORECASE) 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_call_details(call, data): done = False while not done: if call in data: return data[call].split(',') call = call[:-1] if call == "": return ["-", "-"] 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: b_user = str.encode(self.config['cluster']['user']+"\n") telnet.write(b_user) elif " Hello " in line: print(fg("grey_27") + line + attr("reset")) foreground = "white" background = "grey_27" sep = fg("grey_27")+'|'+fg(foreground) row = ["DE", sep, "Freq", sep, "DX", \ sep, "Country", sep, "C", sep, "L", sep, "Comment", sep, "Time"] print(bg(background) + fg(foreground) + \ '{:9.9} {:<1} {:>7.7} {:<1} {:<10.10} {:<1} {:<16.16} {:<1} {:<2.2} {:<1} {:<1.1} {:<1} {:<30.30} {:<1} {:<4.4}'.format(*row) + attr("reset")) b_cmd = str.encode("sh/dx/50 @\n") telnet.write(b_cmd) elif "DX de" in line or "Dx de" in line: try: band_col = "" call_de = re.search('D(X|x) de (.+?): ', line).group(2) 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.dxcc) call_details = self.get_call_details(call_dx, self.config['dxcc']) areaname = call_details[0] continent = call_details[1] lotw_date = self.check_lotw(call_dx) lotw = "" if lotw_date: lotw = "✓" try: if self.config['colors']['color_by'] == "band": foreground = self.config['band_colors'][freq[:-5]] elif self.config['colors']['color_by'] == "continent": foreground = self.config['cont_colors'][continent] else: foreground = "white" except Exception: foreground = "white" freq = freq.replace('.0', '') if areaname.lower() not in self.qsl_countries: background = self.config['colors']['alert_bg'] foreground = self.config['colors']['alert_fg'] else: background = self.config['colors']['default_bg'] sep = fg("grey_27")+'|'+fg(foreground) row = [call_de, sep, freq, sep, call_dx, \ sep, areaname, sep, continent, sep, lotw, sep, comment, sep, time] print(bg(background) + fg(foreground) + \ '{:9.9} {:<1} {:>7.7} {:<1} {:<10.10} {:<1} {:<16.16} {:<1} {:<2.2} {:<1} {:<1.1} {:<1} {:<30.30} {:<1} {:<4.4}'.format(*row) + attr("reset")) except AttributeError: 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