from hashlib import md5 from os import listdir import pickle import sys import random import time class Base: def __init__(self): self.create_time = time.localtime() self.str_time = time.strftime("%Y%m%d%H%M%S", self.create_time) self.__gene_id() def __gene_id(self): self.__id_seed: str = self.str_time + str(random.randint(10000, 99999)) self.id: str = md5(self.__id_seed.encode("UTF-8")).hexdigest() class Entry(Base): def __init__(self, title: str = "未命名事项"): Base.__init__(self) if title == "未命名事项": self.title: str = title + self.str_time[4:8] else: self.title: str = title self.content: str = "在这里输入事项内容" self.set_priority() self.set_deadline() self.sub_entries_dict: dict = {} def set_priority(self, priority: float = 0): if priority < -10: print("最低优先级为-10,已自动设置为-10") priority = -10.0 elif priority > 10: print("最高优先级为10,已自动设置为10") priority = 10.0 self.priority: float = priority def set_deadline(self, deadline_date: time.struct_time = time.localtime(time.time()+time.mktime(time.strptime("7", "%d")))): if deadline_date < time.localtime(): print("\033[1;31mERROR: Let it RIP if it's dead already\033[0m") return 1 self.deadline = deadline_date return 0 def set_content(self, content: str): self.content = content class Coordinate(Base): def __init__(self): Base.__init__(self) self.name = "未命名坐标系" + self.str_time # Base.__gene_id(self) self.entries_dict = {} self.entries_num = 0 def show_entries(self): print(self.entries_dict) def add_entry(self, entry_in: Entry): self.entries_dict[entry_in.entry_id] = entry_in self.entries_num += 1 def del_entry(self, entry_in: Entry): try: del self.entries_dict[entry_in.entry_id] self.entries_num -= 1 except KeyError: print("\033[1;31mERROR: Entry doesn't exist\033[0m") def save_coord(self): with open("coord/" + self.name + ".crd", "wb") as f: pickle.dump(self, f, pickle.HIGHEST_PROTOCOL) def __str__(self) -> str: return ( "Title: " + self.name + "\nId: " + self.id + "\nEntries number: " + str(self.entries_num) ) class Interface: def __init__(self): self.coordinate_dict: dict = {} self.exit: bool = False self.func_dict = { "exit": self.__exit, "open": self.__open_coord, "ls": self.__list_coord, "show": self.__show_now_coord, "entry": self.__new_entry, "chcrd": self.__coord_changer, } def start(self): print( "*******************************\n*Welcome to Jt mission manager*\n*******************************\n" ) self.__coord_changer([]) while not (self.exit): command = input("\033[1;32m> \033[0m").split() try: func_name = command[0] try: func = self.func_dict[func_name] func(command[1:]) except KeyError: print("\033[1;31mERROR: Command not found\033[0m") except IndexError: pass def __open_coord(self, coord_file: str): with open(coord_file, "rb") as f: self.now_coord: Coordinate = pickle.load(f) def __list_coord(self): self.files = listdir("coord") if self.files: i = 0 for f in self.files: print(i, f) i += 1 def __save_now_coord(self): save_or_not: str = input("Save the opened coordinate? Y/n") if save_or_not in ["Y", "y", "1"]: self.now_coord.save_coord() return 0 elif save_or_not in ["N", "n", "0"]: return 0 else: self.__save_now_coord() def __coord_changer(self, arg: list): try: self.now_coord self.__save_now_coord() except AttributeError: pass print("Select a coordinate to open:") self.__list_coord() coord_file = self.files[ int(input("\033[1;32mType in the coordinate number:\033[0m")) ] self.__open_coord("coord/" + coord_file) def __new_entry(self, arg: list): e = Entry(arg[0]) e.content = sys.stdin.readlines() def __new_coord(self, arg: list): c = Coordinate() c.name = arg[0] raise NotImplementedError def __show_now_coord(self, arg: list): print(self.now_coord) def __add_coordinate(self, c: Coordinate): if not c.id in self.coordinate_dict: self.coordinate_dict[c.id] = c else: print("\033[1;31mERROR: It's already in there\033[0m") def __exit(self, arg): self.exit = True def main(): i = Interface() i.start() if __name__ == "__main__": main()