Added script creator and a bunch of print methods

This commit is contained in:
LazoCoder 2017-04-28 03:46:39 -04:00
parent c8b3c5d8f1
commit a863512084
4 changed files with 253 additions and 38 deletions

View file

@ -82,7 +82,7 @@ I highly suggest making the font colors black and the terminal window transparen
# Adding Custom Images
The folder Images/Extra is for adding custom images. You can manually add backgrounds to this folder and they will be visible to the program. To see a list of all the custom backgrounds type:
The folder Images/Extra is for adding custom images. You can manually add backgrounds to this folder and they will be visible to the program. Only PNG format is supported. To see a list of all the custom backgrounds type:
```
pokemon extra
```

View file

@ -1,28 +1,19 @@
# The Database object is a container for all the supported Pokemon. It loads up all the Pokemons'
# IDs and names from a text file. It also analyzes all the images available in the 'Extra' folder
# and stores them in a separate data structure. The Pokemon in the text file are already assumed
# to exist in the other folders, so there is no reason to traverse them.
#
# The Pokemon are stored as Pokemon objects in a list. They contain an ID, name, region, and
# folder location. The 'Extra' Pokemon images are stored as tuples in a separate list. The
# reason for this is because 'Extra' images don't have IDs. The tuple contains the name of
# the image and the location of the image.
# The Database object is a container for all the supported Pokemon.
import os
from sys import argv
class Pokemon:
__id = "" # ID is stored as a string because it must maintain "003" format, not "3".
__name = ""
__region = ""
__folder = "" # The location of the image.
__path = "" # The location of the image.
def __init__(self, identifier, name, region, folder):
def __init__(self, identifier, name, region, path):
self.__id = identifier
self.__name = name
self.__region = region
self.__folder = folder
self.__path = path
def get_id(self):
return self.__id
@ -33,19 +24,22 @@ class Pokemon:
def get_region(self):
return self.__region
def get_folder(self):
return self.__folder
def get_path(self):
return self.__path
def is_extra(self):
return self.__id is None
def __str__(self):
return self.get_id() + " " + self.get_name() + " at " + self.get_folder()
return self.get_id() + " " + self.get_name() + " at " + self.get_path()
class Database:
__pokemon_list = []
__pokemon_dictionary = {}
__extra_pokemon = {} # The Pokemon from the 'Extra' folder.
__directory = "" # The global location of the code.
__MAX_ID = 493 # Highest possible Pokemon ID.
__regions = ('kanto', 'johto', 'hoenn', 'sinnoh')
def __init__(self):
self.directory = os.get_exec_path()[0]
@ -56,11 +50,47 @@ class Database:
string = "POKEMON:\n"
for element in self.__pokemon_list:
string += str(element) + "\n"
string += "EXTRA:\n"
for element in self.__extra_pokemon:
string += str(element) + " in " + str(self.__extra_pokemon[element] + "\n")
return string[:-1] # Remove the final new line ("\n").
def get_all(self):
# Get all the Pokemon.
result = []
for pokemon in self.__pokemon_list:
result.append(pokemon)
return result
def get_kanto(self):
# Get all the Pokemon from the Kanto region.
return self.__get_region("kanto")
def get_johto(self):
# Get all the Pokemon from the Johto region.
return self.__get_region("kanto")
def get_hoenn(self):
# Get all the Pokemon from the Hoenn region.
return self.__get_region("hoenn")
def get_sinnoh(self):
# Get all the Pokemon from the Sinnoh region.
return self.__get_region("sinnoh")
def get_extra(self):
# Get all the Extra Pokemon images available.
return self.__get_region(None)
def get_regions(self):
# Get all the supported regions.
return self.__regions
def __get_region(self, region):
# Helper method for getting all the Pokemon of a specified region.
result = []
for pokemon in self.__pokemon_list:
if pokemon.get_region() == region:
result.append(pokemon)
return result
def pokemon_exists(self, pokemon):
# Check for a Pokemon by ID or name.
if type(pokemon) is int or str(pokemon).isdigit():
@ -78,11 +108,14 @@ class Database:
def name_exists(self, name):
# Check for Pokemon by Name.
if name.lower() in self.__pokemon_dictionary:
return True
if name.lower() in self.__extra_pokemon:
return True
return False
return name.lower() in self.__pokemon_dictionary
def names_starting_with(self, prefix):
result = []
for pokemon in self.__pokemon_list:
if str(pokemon.get_name()).startswith(prefix):
result.append(pokemon)
return result
def __load_data(self):
# Load all the Pokemon data. This does not include the 'Extra' Pokemon.
@ -93,8 +126,8 @@ class Database:
name = line[len(identifier)+1:-1].lower() # The rest is the name (minus the new line at the end).
identifier = self.__add_zeroes(identifier) # This statement cannot occur before name has been created.
region = self.__determine_region(identifier)
folder = self.__determine_folder(identifier)
pokemon = Pokemon(identifier, name, region, folder)
path = self.__determine_folder(identifier) + "/" + identifier + ".png"
pokemon = Pokemon(identifier, name, region, path)
self.__pokemon_list.append(pokemon)
self.__pokemon_dictionary[pokemon.get_name()] = pokemon
@ -103,8 +136,13 @@ class Database:
for file in os.listdir(self.directory + "/./Images/Extra"):
if file.endswith(".png"):
name = os.path.join("/Images/Extra", file).split('/')[-1][0:-4].lower()
folder = self.directory + "/./Images/Extra"
self.__extra_pokemon[name] = folder
path = self.directory + "/./Images/Extra"
pokemon = Pokemon(None, name, None, path)
if name in self.__pokemon_dictionary:
raise Exception("Duplicate names detected. "
"The name of the file " + str(name) + ".png in the folder 'Extra' must be changed.")
self.__pokemon_list.append(pokemon)
self.__pokemon_dictionary[pokemon.get_name()] = pokemon
@staticmethod
def __add_zeroes(number):
@ -147,11 +185,3 @@ class Database:
return self.directory + "/./Images/Generation IV - Sinnoh"
else:
raise Exception("Pokemon ID cannot be greater than 493.")
# Method for debugging.
if __name__ == "__main__":
database = Database()
if len(argv) == 1:
print(database)
else:
print(database.pokemon_exists(argv[1]))

113
main.py Normal file
View file

@ -0,0 +1,113 @@
#!/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5
# The main module that brings everything together.
from sys import argv
from database import Pokemon, Database
def print_list(list_of_items):
# Print all the items in a list. Used for printing each Pokemon from a particular region.
for item in list_of_items:
print(item)
def print_columns(items):
# Print a list as multiple columns instead of just one.
rows = []
items_per_column = int(len(items) / 5) + 1
for index in range(0, len(items)):
pokemon = items[index]
if not pokemon.is_extra():
name = pokemon.get_id() + " " + pokemon.get_name()
else:
name = "--- " + pokemon.get_name()
name = name.ljust(20)
if len(rows) < items_per_column:
rows.append(name)
else:
rows[index % items_per_column] += name
print_list(rows)
def prefix_search(db, arg):
# Find all Pokemon in database, db, with the prefix, arg.
result = db.names_starting_with(arg)
if len(result) == 0:
print("No Pokemon found with prefix '" + arg + "'.")
else:
print_columns(result)
def print_extra(db):
# Print all the 'Extra' Pokemon from the 'Extra' folder.
result = db.get_extra()
if len(result) == 0:
print("No Pokemon were found in Images/Extra.")
else:
print_columns(result)
def print_usage():
# Print the instructions of usage.
print(
'''
Usage:
pokemon [parameter]
Parameters:
[name] - Change the terminal background to the specified Pokemon.
[index] - Change the terminal background to a Pokemon by its index.
[region] - List all the Pokemon of the specified region.
[letter] - List all Pokemon who's names begin with a particular letter.
Other Parameters:
pokemon all - List all the Pokemon supported.
pokemon random - Pick a Pokemon at random.
pokemon ? - Identify the current Pokemon.
pokemon regions - List all the available regions.
pokemon slideshow - Iterate through each Pokemon.
pokemon slideshow-kanto - Iterate through each Pokemon in the specified reigon.
pokemon extra - List all the Pokemon from the 'Extra' folder.
pokemon help - Display this menu.
''')
def single_argument_handler(arg):
# Handle the logic for when there is only one command line parameter inputted.
arg = argv[1].lower()
db = Database()
if len(arg) < 3 and arg.isalpha():
prefix_search(db, arg)
elif arg == "extra" or arg == "custom":
print_extra(db)
elif arg == "regions":
print_list(db.get_regions())
elif arg == "help" or arg == "--help" or arg == "-h":
print_usage()
elif arg == "kanto":
print_columns(db.get_kanto())
elif arg == "johto":
print_columns(db.get_johto())
elif arg == "hoenn":
print_columns(db.get_hoenn())
elif arg == "sinnoh":
print_columns(db.get_sinnoh())
elif arg == "all" or arg == "pokemon" or arg == "list":
print_columns(db.get_all())
if __name__ == "__main__":
# Entrance to the program.
if len(argv) == 1:
print("No command line arguments specified. Try typing in a Pokemon name or number.")
elif len(argv) == 2:
single_argument_handler(argv[1])
else:
print("Only one command line argument is supported.")

72
scripter.py Normal file
View file

@ -0,0 +1,72 @@
import os
def __terminal_script(pokemon):
# Create the content for script that will change the terminal background image.
content = "tell application \"iTerm\"\n"
content += "\ttell current session of current window\n"
content += "\t\tset background image to \"" + pokemon.get_path() + "\"\n"
content += "\tend tell\n"
content += "end tell"
return content
def __wallpaper_script(pokemon):
# Create the content for the script that will change the wallpaper.
path = pokemon.get_path() + pokemon.get_id()
content = "tell application \"System Events\"\n"
content += "\ttell current desktop\n"
content += "\t\tset picture to \"" + pokemon.get_path() + "\"\n"
content += "\tend tell\n"
content += "end tell"
return content
def __create_terminal_script(pokemon):
# Create and save the script for changing the terminal background image.
content = __terminal_script(pokemon)
file = open(os.get_exec_path()[0] + "/./Scripts/background.scpt", "wb")
file.write(bytes(content, 'UTF-8'))
file.close()
def __create_wallpaper_script(pokemon):
# Create and save the script for changing the wallpaper.
content = __wallpaper_script(pokemon)
file = open(os.get_exec_path()[0] + "/./Scripts/wallpaper.scpt", "wb")
file.write(bytes(content, 'UTF-8'))
file.close()
def __create_terminal_bash():
# Create and save the run.sh that will execute the AppleScript if the correct run.sh doesn't already exist.
content = "#!/bin/bash\n" + "osascript " + os.get_exec_path()[0] + "/./Scripts/background.scpt"
if open(os.get_exec_path()[0] + "/./Scripts/run.sh", 'r').read() == content:
return
file = open(os.get_exec_path()[0] + "/./Scripts/run.sh", 'wb')
file.write(bytes(content, 'UTF-8'))
file.close()
def __create_wallpaper_bash():
# Create and save the run.sh that will execute the AppleScript if the correct run.sh doesn't already exist.
content = "#!/bin/bash\n" + "osascript " + os.get_exec_path()[0] + "/./Scripts/wallpaper.scpt"
if open(os.get_exec_path()[0] + "/./Scripts/run.sh", 'r').read() == content:
return
file = open(os.get_exec_path()[0] + "/./Scripts/run.sh", 'wb')
file.write(bytes(content, 'UTF-8'))
file.close()
def change_terminal(pokemon):
# Create, save and run the bash script to change the terminal background.
__create_terminal_script(pokemon)
__create_terminal_bash()
os.system(os.get_exec_path()[0] + "/./Scripts/run.sh")
def change_wallpaper(pokemon):
# Create, save and run the bash script to change the wallpaper.
__create_wallpaper_script(pokemon)
__create_wallpaper_bash()
os.system(os.get_exec_path()[0] + "/./Scripts/run.sh")