From db46ee8a65aae3b7b9633bda1e52acd79d9ea134 Mon Sep 17 00:00:00 2001 From: quadrismegistus Date: Thu, 10 Sep 2020 22:32:59 +0100 Subject: [PATCH] cli fun --- ...rator-2262c4d3b4e9c598cfd1e73b028756ac.jpg | Bin 0 -> 60941 bytes komrade/__init__.py | 3 +- komrade/art.py | 102 ++++++- komrade/backend/keymaker.py | 45 ++- komrade/backend/mazes.py | 31 ++ komrade/backend/people.py | 68 +---- komrade/cli/__init__.py | 0 komrade/cli/artcode.py | 285 ++++++++++++++++++ komrade/cli/cli.py | 155 ++++++++++ komrade/constants.py | 10 +- komrade/utils.py | 17 +- 11 files changed, 634 insertions(+), 82 deletions(-) create mode 100644 docs/operator-2262c4d3b4e9c598cfd1e73b028756ac.jpg create mode 100644 komrade/cli/__init__.py create mode 100644 komrade/cli/artcode.py create mode 100644 komrade/cli/cli.py diff --git a/docs/operator-2262c4d3b4e9c598cfd1e73b028756ac.jpg b/docs/operator-2262c4d3b4e9c598cfd1e73b028756ac.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d5c91e2b4ea077701f233cccce166143ac117205 GIT binary patch literal 60941 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 UFo{D^0)1Rc^xU)RJUnOr+5H9>5dZ)H literal 0 HcmV?d00001 diff --git a/komrade/__init__.py b/komrade/__init__.py index b4485fb..4df33fa 100644 --- a/komrade/__init__.py +++ b/komrade/__init__.py @@ -1,8 +1,7 @@ # basic config -from .art import * from .constants import * from .utils import * - +from .cli.artcode import * # common python imports import os,sys diff --git a/komrade/art.py b/komrade/art.py index 82faad6..590348b 100644 --- a/komrade/art.py +++ b/komrade/art.py @@ -23,6 +23,35 @@ ART_TELEPHONE = ''' "-.;_..--"" ''' +ART_PHONE_SM1 = """ + .----------------. + / _H______H_ \@, + \____/ \____/ @, + / \ `@ + | LI LI LI | ,@ + | LI LI LI | ,@' + | LI LI LI | ,@' + | LI LI LI |@@' +jgs \ /' + `----------' +""" + +ART_ROTARY2=""" + _______________ + / \ + | .---------. |@ + '---' .-----. '---'@ + .' /6 5_4 3\ '. @ + | |7 /...\ 2| | @ + | |8 \___/ 1| | @ + | \_9_0_)\/ | @@ + /==|_____________|@@@@ + H-------------------@@ + H ) || || ( @@ + H / || || \ @ + H |----''---''----| +=/ |_______________| +""" ART_KEY = """ @@ -182,4 +211,75 @@ ART_PAYPHONE = """ | |'--'| | OoO | '----' | jgs \_________________/ -""" \ No newline at end of file +""" + + + + + + + + + + +#### +# code +### +from PIL import Image +ASCII_CHARS = [ '#', '?', '%', '.', 'S', '+', '.', '*', ':', ',', '@'] + +def scale_image(image, new_width=100): + """Resizes an image preserving the aspect ratio. + """ + (original_width, original_height) = image.size + aspect_ratio = original_height/float(original_width) + new_height = int(aspect_ratio * new_width) + + new_image = image.resize((new_width, new_height)) + return new_image + +def convert_to_grayscale(image): + return image.convert('L') + +def map_pixels_to_ascii_chars(image, range_width=25): + """Maps each pixel to an ascii char based on the range + in which it lies. + + 0-255 is divided into 11 ranges of 25 pixels each. + """ + + pixels_in_image = list(image.getdata()) + pixels_to_chars = [ASCII_CHARS[pixel_value//range_width] for pixel_value in + pixels_in_image] + + return "".join(pixels_to_chars) + +def convert_image_to_ascii(image, new_width=50): + image = scale_image(image) + image = convert_to_grayscale(image) + + pixels_to_chars = map_pixels_to_ascii_chars(image) + len_pixels_to_chars = len(pixels_to_chars) + + image_ascii = [pixels_to_chars[index: index + new_width] for index in + range(0, len_pixels_to_chars, new_width)] + + return "\n".join(image_ascii) + +def handle_image_conversion(image_filepath): + image = None + try: + image = Image.open(image_filepath) + except Exception as e: + # print "Unable to open image file {image_filepath}.".format(image_filepath=image_filepath) + # print e + return + + image_ascii = convert_image_to_ascii(image) + print(image_ascii) + +if __name__=='__main__': + import sys + + image_file_path = sys.argv[1] + handle_image_conversion(image_file_path) \ No newline at end of file diff --git a/komrade/backend/keymaker.py b/komrade/backend/keymaker.py index 21e17c8..2760e6d 100644 --- a/komrade/backend/keymaker.py +++ b/komrade/backend/keymaker.py @@ -3,7 +3,7 @@ from komrade import * from komrade.backend.crypt import * from abc import ABC, abstractmethod -class KomradeKey(ABC): +class KomradeKey(ABC,Logger): @abstractmethod def encrypt(self,msg,**kwargs): pass @abstractmethod @@ -31,14 +31,23 @@ class KomradeSymmetricKey(KomradeKey): return self.cell.encrypt(msg,**kwargs) def decrypt(self,msg,**kwargs): return self.cell.decrypt(msg,**kwargs) - + +def getpass_status(passphrase=None): + while not passphrase: + passphrase1 = getpass(f'@Keymaker: What is a *memorable* pass word or phrase? Do not write it down.\n@{name}: ') + passphrase2 = getpass(f'@Keymaker: Could you repeat that?') + if passphrase1!=passphrase2: + self.status('@Keymaker: Those passwords didn\'t match. Please try again.',clear=False,pause=False) + else: + return passphrase1 + class KomradeSymmetricKeyWithPassphrase(KomradeSymmetricKey): def __init__(self,passphrase=DEBUG_DEFAULT_PASSPHRASE, why=WHY_MSG): self.passphrase=passphrase if not self.passphrase: - self.passphrase=getpass.getpass(why) + self.passphrase=getpass_status if SHOW_LOG else getpass.getpass(why) #return self.passphrase @property def data(self): return KEY_TYPE_SYMMETRIC_WITH_PASSPHRASE.encode('utf-8') @@ -70,20 +79,36 @@ class KomradeAsymmetricKey(KomradeKey): def data(self): return self.key class KomradeAsymmetricPublicKey(KomradeAsymmetricKey): + def __init__(self,pubkey,privkey=None): + self.pubkey=pubkey + self.privkey=privkey @property def key(self): return self.pubkey @property def data(self): return self.pubkey - def __repr__(self): return f'''[Asymmetric Public Key] ({self.discreet})''' + def __repr__(self): return f'''[Asymmetric Public Key] ({self.data_b64.decode()})''' class KomradeAsymmetricPrivateKey(KomradeAsymmetricKey): + def __init__(self,privkey,pubkey=None): + self.pubkey=pubkey + self.privkey=privkey @property def data(self): return self.privkey @property def key(self): return self.privkey def __repr__(self): return f'''[Asymmetric Private Key] ({self.discreet})''' -def make_key_discreet(data,len_start=10,len_end=10,ellipsis='.',show_len=True): +def make_key_discreet(data,chance_bowdlerize=0.5): + import random + + if not data: return '?' + if not isBase64(data): data=b64encode(data) + key=data.decode() + + return ''.join((k if random.random()