diff --git a/komrade/app/config.py b/komrade/app/config.py index affe23e..a8ad111 100644 --- a/komrade/app/config.py +++ b/komrade/app/config.py @@ -1,8 +1,8 @@ -#from p2p_api import -PORT_LISTEN = 5969 +# #from p2p_api import +# PORT_LISTEN = 5969 -# NODES_PRIME = [("128.232.229.63",8467), ("68.66.241.111",8467)] -NODES_PRIME = [("128.232.229.63",8467)] +# # NODES_PRIME = [("128.232.229.63",8467), ("68.66.241.111",8467)] +# NODES_PRIME = [("128.232.229.63",8467)] @@ -14,150 +14,150 @@ NODES_PRIME = [("128.232.229.63",8467)] -DEFAULT_URI='/login/' - -import random,platform -HORIZONTAL = True # random.choice([True,True,True,False]) -FACTOR=1 -WINDOW_SIZE = (1136*FACTOR,640*FACTOR) if HORIZONTAL else (640*FACTOR,1136*FACTOR) - - -PLAYING_CARDS = (2.5,3.5) -ASPECT_RATIO = PLAYING_CARDS[0]/PLAYING_CARDS[1] -ASPECT_RATIO = 1/ASPECT_RATIO -HEIGHT = 850 - -if platform.platform().startswith('Linux'): - HEIGHT *= 1.25 - - -WINDOW_SIZE=int(HEIGHT),int(HEIGHT * ASPECT_RATIO) - -BG_IMG='assets/bg-brown.png' - -grass=(201,203,163) -russiangreen = (109,140,96) -huntergreen = (67,92,61) -kombugreen = (49,67,45) -pinetreegreen = (29,40,27) -junglegreen = (15, 21, 14) - -browncoffee=(77, 42, 34) -rootbeer=(38, 7, 1) -blackbean=(61, 12, 2) -burntumber=(132, 55, 34) -brownsugar=(175, 110, 81) -antiquebrass= (198, 144, 118) -royalbrown=(94, 55, 46) -bole=(113, 65, 55) -liver= (110, 56, 31) -bistre=(58, 33, 14) -bistre2=(43, 21, 7) -skin1=(89, 47, 42) -skin2=(80, 51, 53) -skin3=(40, 24, 26) - -grullo=177, 158, 141 -smokyblack=33, 14, 0 -liverchestnut=148, 120, 96 -ashgray=196, 199, 188 -livchestnut2=156, 106, 73 -beaver=165, 134, 110 -rawumber=120, 95, 74 - -persianred=202,52,51 -vermillion=126,25,27 -indianred=205,92,92 -barnred=124,10,2 -maroon=128,0,0 -bloodred=98, 23, 8 -rust=188, 57, 8 -darksienna=34, 9, 1 -yellowcrayola=246, 170, 28 -darkred=148, 27, 12 -rosewood=94, 11, 21 -redviolet=144, 50, 61 -bone=217, 202, 179 -bronze=188, 128, 52 -shadow=140, 122, 107 -orangered=194, 3, 3 +# DEFAULT_URI='/login/' + +# import random,platform +# HORIZONTAL = True # random.choice([True,True,True,False]) +# FACTOR=1 +# WINDOW_SIZE = (1136*FACTOR,640*FACTOR) if HORIZONTAL else (640*FACTOR,1136*FACTOR) + + +# PLAYING_CARDS = (2.5,3.5) +# ASPECT_RATIO = PLAYING_CARDS[0]/PLAYING_CARDS[1] +# ASPECT_RATIO = 1/ASPECT_RATIO +# HEIGHT = 850 + +# if platform.platform().startswith('Linux'): +# HEIGHT *= 1.25 + + +# WINDOW_SIZE=int(HEIGHT),int(HEIGHT * ASPECT_RATIO) + +# BG_IMG='assets/bg-brown.png' + +# grass=(201,203,163) +# russiangreen = (109,140,96) +# huntergreen = (67,92,61) +# kombugreen = (49,67,45) +# pinetreegreen = (29,40,27) +# junglegreen = (15, 21, 14) + +# browncoffee=(77, 42, 34) +# rootbeer=(38, 7, 1) +# blackbean=(61, 12, 2) +# burntumber=(132, 55, 34) +# brownsugar=(175, 110, 81) +# antiquebrass= (198, 144, 118) +# royalbrown=(94, 55, 46) +# bole=(113, 65, 55) +# liver= (110, 56, 31) +# bistre=(58, 33, 14) +# bistre2=(43, 21, 7) +# skin1=(89, 47, 42) +# skin2=(80, 51, 53) +# skin3=(40, 24, 26) + +# grullo=177, 158, 141 +# smokyblack=33, 14, 0 +# liverchestnut=148, 120, 96 +# ashgray=196, 199, 188 +# livchestnut2=156, 106, 73 +# beaver=165, 134, 110 +# rawumber=120, 95, 74 + +# persianred=202,52,51 +# vermillion=126,25,27 +# indianred=205,92,92 +# barnred=124,10,2 +# maroon=128,0,0 +# bloodred=98, 23, 8 +# rust=188, 57, 8 +# darksienna=34, 9, 1 +# yellowcrayola=246, 170, 28 +# darkred=148, 27, 12 +# rosewood=94, 11, 21 +# redviolet=144, 50, 61 +# bone=217, 202, 179 +# bronze=188, 128, 52 +# shadow=140, 122, 107 +# orangered=194, 3, 3 -dutchwhite=229,219,181 -# black=(0,0,0) -black=15, 15, 15 #5, 8, 13 - -eerieblack=23, 22, 20 -bistre=58, 38, 24 -tuscanred=117, 64, 67 -grullo2=154, 136, 115 -blackolive=55, 66, 61 - - -dogreen=103, 116, 35 -sage=187, 193, 145 -alabaster2 = 241, 236, 226 -coyotebrown = 138, 93, 61 -vandykebrown = 90, 62, 41 - -darksienna2=55, 6, 23 -xiketic=3, 7, 30 - -rossacorsa=208, 0, 0 -raisinblack=38, 34, 34 -coffee2=67, 58, 58 -rufusred=171, 4, 4 -darksienna3=56, 22, 13 - - -black2=0, 20, 39 -xanadu=112, 141, 129 -jasmine=244, 213, 141 -ioe=191, 6, 3 -dred=141, 8, 1 -caputmort1=74, 36, 25 - - -# SCHEME = 'lgreen' -# SCHEME = 'bronze' -SCHEME = 'dark' - - - -# light green theme? -if SCHEME=='lgreen': - COLOR_TOOLBAR= huntergreen #bone #smokyblack #5,5,5 #russiangreen #pinetreegreen #kombugreen #(12,5,5) #russiangreen - COLOR_BG = grass # russiangreen #(0,73,54) - COLOR_LOGO = coyotebrown # grass#russiangreen #(0,0,0) #(0,0,0) #(151,177,140) #(132,162,118) #(109,140,106) - COLOR_TEXT = black #(255,245,200) #(0,0,0,1) #(241,233,203) #COLOR_ICON #(207,219,204) #(239,235,206) # (194,211,187) # (171,189,163) # (222,224,198) # COLOR_LOGO #(223, 223, 212) - COLOR_CARD = bone #(67,92,61) #(12,9,10) - COLOR_CARD_BORDER = COLOR_CARD - COLOR_ICON=COLOR_LOGO - -elif SCHEME=='bronze': - COLOR_TOOLBAR= junglegreen - COLOR_BG = bronze - COLOR_LOGO = rufusred #yellowcrayola #0,0,0 - COLOR_TEXT = black - COLOR_CARD = bone - COLOR_CARD_BORDER = COLOR_CARD - COLOR_ICON=COLOR_LOGO - -else: - # COLOR_TOOLBAR= black - # COLOR_TOOLBAR=bronze - # COLOR_LOGO = black #bronze #0,0,0 +# dutchwhite=229,219,181 +# # black=(0,0,0) +# black=15, 15, 15 #5, 8, 13 + +# eerieblack=23, 22, 20 +# bistre=58, 38, 24 +# tuscanred=117, 64, 67 +# grullo2=154, 136, 115 +# blackolive=55, 66, 61 + + +# dogreen=103, 116, 35 +# sage=187, 193, 145 +# alabaster2 = 241, 236, 226 +# coyotebrown = 138, 93, 61 +# vandykebrown = 90, 62, 41 + +# darksienna2=55, 6, 23 +# xiketic=3, 7, 30 + +# rossacorsa=208, 0, 0 +# raisinblack=38, 34, 34 +# coffee2=67, 58, 58 +# rufusred=171, 4, 4 +# darksienna3=56, 22, 13 + + +# black2=0, 20, 39 +# xanadu=112, 141, 129 +# jasmine=244, 213, 141 +# ioe=191, 6, 3 +# dred=141, 8, 1 +# caputmort1=74, 36, 25 + + +# # SCHEME = 'lgreen' +# # SCHEME = 'bronze' +# SCHEME = 'dark' + + + +# # light green theme? +# if SCHEME=='lgreen': +# COLOR_TOOLBAR= huntergreen #bone #smokyblack #5,5,5 #russiangreen #pinetreegreen #kombugreen #(12,5,5) #russiangreen +# COLOR_BG = grass # russiangreen #(0,73,54) +# COLOR_LOGO = coyotebrown # grass#russiangreen #(0,0,0) #(0,0,0) #(151,177,140) #(132,162,118) #(109,140,106) +# COLOR_TEXT = black #(255,245,200) #(0,0,0,1) #(241,233,203) #COLOR_ICON #(207,219,204) #(239,235,206) # (194,211,187) # (171,189,163) # (222,224,198) # COLOR_LOGO #(223, 223, 212) +# COLOR_CARD = bone #(67,92,61) #(12,9,10) +# COLOR_CARD_BORDER = COLOR_CARD +# COLOR_ICON=COLOR_LOGO + +# elif SCHEME=='bronze': +# COLOR_TOOLBAR= junglegreen +# COLOR_BG = bronze +# COLOR_LOGO = rufusred #yellowcrayola #0,0,0 +# COLOR_TEXT = black +# COLOR_CARD = bone +# COLOR_CARD_BORDER = COLOR_CARD +# COLOR_ICON=COLOR_LOGO + +# else: +# # COLOR_TOOLBAR= black +# # COLOR_TOOLBAR=bronze +# # COLOR_LOGO = black #bronze #0,0,0 - # COLOR_BG = black - COLOR_BG=bistre - COLOR_TOOLBAR=black - COLOR_LOGO=bronze - COLOR_TEXT = black - COLOR_CARD = bone - COLOR_CARD_BORDER = COLOR_CARD - COLOR_ICON=COLOR_LOGO - COLOR_ACCENT = huntergreen +# # COLOR_BG = black +# COLOR_BG=bistre +# COLOR_TOOLBAR=black +# COLOR_LOGO=bronze +# COLOR_TEXT = black +# COLOR_CARD = bone +# COLOR_CARD_BORDER = COLOR_CARD +# COLOR_ICON=COLOR_LOGO +# COLOR_ACCENT = huntergreen -COLOR_INACTIVE = COLOR_CARD -COLOR_ACTIVE = russiangreen \ No newline at end of file +# COLOR_INACTIVE = COLOR_CARD +# COLOR_ACTIVE = russiangreen \ No newline at end of file diff --git a/komrade/app/main.py b/komrade/app/main.py index 01e0976..0b958af 100644 --- a/komrade/app/main.py +++ b/komrade/app/main.py @@ -124,6 +124,7 @@ class MessagePopup(MDDialog2): + pass class MessagePopupCard(MDDialog2): def __init__(self,*x,**y): @@ -134,8 +135,8 @@ class MessagePopupCard(MDDialog2): # self.color_bg=rgb(*COLOR_CARD) self.ok_to_continue=False - #def on_dismiss(self): - # return True + def on_dismiss(self): + return True def on_touch_down(self,touch): self.ok_to_continue=True @@ -145,7 +146,6 @@ class MessagePopupCard(MDDialog2): - class TextInputPopupCard(MDDialog2): def say(self,x): self.ok_to_continue=True @@ -178,17 +178,23 @@ class TextInputPopupCard(MDDialog2): self.field.line_color_focus=rgb(*COLOR_TEXT) self.field.line_color_normal=rgb(*COLOR_TEXT,a=0.25) self.field.font_name=FONT_PATH + self.field.font_size='20sp' + self.field_label = UsernameLabel(text='password:' if password else input_name) self.field_label.font_name=FONT_PATH + self.field_label.font_size='20sp' + if title: self.title_label = UsernameLabel(text=title) self.title_label.halign='center' + self.title_label.font_size='20sp' self.title_label.pos_hint={'center_x':0.5} self.title_label.font_name=FONT_PATH #self.field_layout.add_widget(self.title_label) self.layout.add_widget(self.title_label) + self.field_layout.add_widget(self.field_label) self.field_layout.add_widget(self.field) self.layout.add_widget(self.field_layout) @@ -437,8 +443,17 @@ class MainApp(MDApp, Logger): self.root.change_screen_from_uri(self.uri if self.uri else DEFAULT_URI) - - + # build the walker + self.walker=MazeWalker(callbacks=self.callbacks) + self.torpy_logger = logging.getLogger('torpy') + self.torpy_logger.propagate=False + self.torpy_logger.addHandler(self.walker) + import ipinfo + ipinfo_access_token = '90df1baf7c373a' + self.ipinfo_handler = ipinfo.getHandler(ipinfo_access_token) + + from komrade.app.screens.map import MapWidget + self.map = MapWidget() return self.root @@ -446,6 +461,29 @@ class MainApp(MDApp, Logger): # kommie = Komrade(username) # if self.exists_locally_as_contact() + @property + def callbacks(self): + return { + 'torpy_guard_node_connect':self.callback_on_hop, + 'torpy_extend_circuit':self.callback_on_hop, + } + + async def callback_on_hop(self,rtr): + if not hasattr(self,'hops'): self.hops=[] + if not self.map.opened: + self.map.open() + # self.map.draw() + + deets = self.ipinfo_handler.getDetails(rtr.ip) + self.hops.append((rtr,deets)) + lat,long=tuple(float(_) for _ in deets.loc.split(',')) + flag=f'{deets.city}, {deets.country_name} ({rtr.nickname})' + + self.map.add_point(lat,long,flag) + self.map.draw() + import asyncio + # await asyncio.sleep(2) + logger.info('CALLBACK ON HOP: ' + flag) def load_store(self): if not self.store.exists('user'): return @@ -615,6 +653,8 @@ class MainApp(MDApp, Logger): if hasattr(self,'msg_dialog0'): self.root.remove_widget(self.msg_dialog0) + if hasattr(self.msg_dialog0,'card'): + self.msg_dialog0.remove_widget(self.msg_dialog0.card) await asyncio.sleep(0.1) while not self.msg_dialog.ok_to_continue: diff --git a/komrade/app/root.kv b/komrade/app/root.kv index ceb6565..2ac300d 100644 --- a/komrade/app/root.kv +++ b/komrade/app/root.kv @@ -27,7 +27,7 @@ pos_hint: {'center_x':0.5, 'center_y':0.5} size_hint:0.5,0.5 padding:'10dp' - md_bg_color:0,0,0,1 + md_bg_color:rgb(*COLOR_BG) #0,0,0,1 canvas: Color: rgb: 1,0,0,2 @@ -45,6 +45,14 @@ font_name: 'assets/font.otf' size_hint:1,None +: + canvas: + Color: + rgb: (0, 0, 0, 0) + Rectangle: + texture: self.texture + size: self.width + 20, self.height + 20 + pos: self.x - 10, self.y - 10 @@ -53,7 +61,7 @@ : type: "custom" size_hint: (None, None) - size: ('200dp','200dp') + size: ('333sp','333sp') # md_bg_color: 0,0,0,1 MDBoxLayout: diff --git a/komrade/app/screens/login/login.py b/komrade/app/screens/login/login.py index bcd0cb0..020701c 100644 --- a/komrade/app/screens/login/login.py +++ b/komrade/app/screens/login/login.py @@ -62,7 +62,6 @@ class LoginScreen(BaseScreen): self.label_title.markup=True self.label_title.color=rgb(*COLOR_TEXT) self.label_title.text='Welcome,' - self.label_title.font_size='28sp' self.layout.add_widget(get_separator('20sp')) self.layout.add_widget(self.label_title) self.layout.add_widget(get_separator('30sp')) @@ -169,6 +168,22 @@ class LoginScreen(BaseScreen): # await self.app.get_input('hello?',get_pass=True,title='gimme your passwrdd') # await self.app.get_input('hello?',get_pass=False,title='gimme your fav color bitch') # return + # self.remove_widget(self.layout) + + + # from screens.map import MapWidget,default_places + # map = MapWidget() + # map.open() + # map.add_point(*default_places['Cambridge'],desc='Cambridge') + # map.draw() + # await asyncio.sleep(1) + # map.add_point(*default_places['San Francisco'],desc='San Francisco') + # map.draw() + # await asyncio.sleep(1) + # map.add_point(*default_places['Reykjavik'],desc='Reykjavik') + # map.draw() + # await asyncio.sleep(1) + # return # return @@ -222,7 +237,7 @@ class LoginScreen(BaseScreen): async def register(self,name): async def logfunc(*x,**y): if not 'komrade_name' in y: y['komrade_name']='Keymaker' - await self.app.stat(*x,**y) + #await self.app.stat(*x,**y) kommie = Komrade(name) @@ -251,7 +266,7 @@ class LoginScreen(BaseScreen): await logfunc(f'The first is your "public key", which you can share with anyone. With it, someone can write you an encrypted message.',komrade_name='Keymaker') - await logfunc(f'You can share it by pasting it to someone in a secure message:\n\n{uri_s}',komrade_name='Keymaker') + await logfunc(f'You can share it by pasting it to someone in a secure message:\n{uri_s}',komrade_name='Keymaker') await logfunc(f'You can also share it IRL, phone to phone, as a QR code. This is what it will look like.',img_src=fnfn,komrade_name='Keymaker') @@ -272,7 +287,9 @@ class LoginScreen(BaseScreen): ### PRIVATE KEY - await logfunc(f"(2) Your PRIVATE encryption key, on the other hand, must be stored only on your device hardware. In fact it's so sensitive we'll even encrypt the encryption key itself.",pause=True,use_prefix=False) + await logfunc(f"(2) Your PRIVATE encryption key, on the other hand, must be stored only on your device hardware: {privkey}") + + await logfunc(f"In fact this private encryption is so sensitive we'll encrypt it itself before storing it on your device -- locking the key itself away with a password.",pause=True,use_prefix=False) passphrase = await self.app.get_input('Please enter a memorable password.', get_pass=True @@ -282,32 +299,25 @@ class LoginScreen(BaseScreen): privkey_decr = KomradeSymmetricKeyWithPassphrase(passhash=passhash) print() - await logfunc(f'''Let's immediately run whatever you typed in for your password through a 1-way hashing algorithm (SHA-256), inflating it to (redacted):\n\n{make_key_discreet_str(passhash)}''',pause=True,clear=False) + await logfunc(f'''We immediately whatever you typed through a 1-way hashing algorithm (SHA-256), scrambling it into (redacted):\n{make_key_discreet_str(passhash)}''',pause=True,clear=False) privkey_encr = privkey_decr.encrypt(privkey.data) privkey_encr_obj = KomradeEncryptedAsymmetricPrivateKey(privkey_encr) kommie._keychain['privkey_encr']=privkey_encr_obj self.log('My keychain now looks like v2:',dict_format(kommie.keychain())) - await logfunc('With this inflated password we can encrypt your super-sensitive private key.',pause=True,clear=True) - - await logfunc(f"Your original private key looks like this (redacted):\n\n{privkey}",pause=True,clear=False) + await logfunc(f'With this scrambled password we can encrypt your super-sensitive private key.') - await logfunc(f"After we encrypt it with your passworded key, it looks like this (redacted):\n\n{privkey_encr_obj}",pause=True,clear=False) - - await logfunc('Only this encrypted version is stored.',pause=True,clear=True) - - - + await logfunc(f'Private key before encryption: {privkey.discreet}',pause=True,clear=False) + await logfunc(f'Private key after encryption: {privkey_encr_obj.discreet}',pause=True,clear=False) # ### PUBLIC KEY - await logfunc('You must also register your username and public key with Komrade @Operator on the remote server',pause=False,clear=False) await logfunc('Connecting you to the @Operator...',komrade_name='Telephone') ## CALL OP WITH PUBKEY - self.app.open_dialog('Calling @Operator...') + # self.app.open_dialog('Calling @Operator...') logger.info('got here!') resp_msg_d = await kommie.ring_ring( { @@ -316,7 +326,7 @@ class LoginScreen(BaseScreen): }, route='register_new_user' ) - self.app.close_dialog() + # self.app.close_dialog() # print() await logfunc(resp_msg_d.get('status'),komrade_name='Operator',pause=True) diff --git a/komrade/app/screens/map.py b/komrade/app/screens/map.py new file mode 100644 index 0000000..20e3f84 --- /dev/null +++ b/komrade/app/screens/map.py @@ -0,0 +1,264 @@ +import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.abspath(os.path.join(os.path.dirname(__file__),'..')),'..','..'))) +from komrade.app.screens.dialog import MDDialog2 +import cartopy +import cartopy.crs as ccrs +import matplotlib.pyplot as plt +from kivymd.uix.boxlayout import MDBoxLayout +from kivymd.uix.gridlayout import MDGridLayout +from kivymd.uix.button import MDFlatButton +from kivymd.uix.label import MDLabel +print('\n'.join(sys.path)) +from komrade.constants import * +# from komrade.app.main import rgb +import io +from kivy.core.image import Image as CoreImage +from kivy.uix.image import Image,AsyncImage +from kivy.core.window import Window +from kivy.app import App +import logging +logger=logging.getLogger(__name__) + +def rgb(r,g,b,a=1): + return (r/255,g/255,b/255,a) + +class MapImage(AsyncImage): + pass + + +class MapWidget(MDDialog2): + @property + def projection(self): + # return ccrs.PlateCarree() + return ccrs.LambertConformal() + + @property + def figsize(self): + # fig = plt.figure() + # dpi=fig.dpi // 2 + dpi=40 + width,height=Window.size + return (width//dpi, height//dpi) + # bbox = fig.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) + # width, height = bbox.width*fig.dpi, bbox.height*fig.dpi + # return (width,height) + + @property + def color_land(self): return rgb(*darksienna3) #darksienna3) + @property + def color_water(self): return rgb(*grullo2) + @property + def color_label(self): return self.color_land + @property + def color_marker(self): return rgb(*rossacorsa) + @property + def color_line(self): return self.color_marker + + def __init__(self): + self.last_lat = None + self.last_long = None + self.points = [] + self.opened=False + self.label=None + + # self.fig = fig = plt.figure(figsize=(20,10)) + plt.rcParams["figure.figsize"] = self.figsize + self.ax = ax = plt.axes( + projection=self.projection, + ) + # ax.set_extent([-170, 165, -55, 75]) + + # ax.background_patch.set_facecolor(rgb(*COLOR_CARD)[:3]) + # ax.outline_patch.set_facecolor(rgb(*COLOR_CARD)[:3]) + # self.ax.stock_img() + # self.ax.coastlines(color=rgb(*COLOR_CARD)) + ax.add_feature(cartopy.feature.OCEAN, zorder=0, color=self.color_water,edgecolor=self.color_water) + ax.add_feature(cartopy.feature.LAND, zorder=0, color=self.color_land, edgecolor=self.color_land) + ax.outline_patch.set_visible(False) + ax.background_patch.set_visible(False) + # ax.set_global() + # ax.gridlines() + + + self.layout=MDBoxLayout() + self.layout.orientation='vertical' + self.layout.cols=1 + self.layout.size_hint=(None,None) + self.layout.size=(Window.size[0],Window.size[1]) # ('666sp','666sp') + self.layout.md_bg_color=rgb(*eerieblack) #rgb(*COLOR_BG,a=1) + # self.layout.adaptive_height=True + # self.layout.height=self.layout.minimum_height + self.layout.spacing='0sp' + self.layout.padding='0sp' + self.img=None + self.label_layout=MDGridLayout() + self.label_layout.orientation='vertical' + self.label_layout.cols=1 + self.label_layout.row_default_height='25sp' + self.label_layout.row_force_default='25sp' + self.label_layout.rows=10 + self.label_layout.pos_hint={'y':0} + self.label_layout.size_hint=(None,None) + self.label_layout.width=Window.size[0] + self.label_layout.height='300sp' + # self.label_layout.size=(Window.size[0],'400sp') + # self.label_layout.size=Window.size # ('666sp','666sp') + # self.layout.add_widget(self.label_layout) + + # do dialog's intro + super().__init__( + type='custom', + text='', + content_cls=self.layout, + buttons=[ + MDFlatButton( + text="disconnect", + text_color=rgb(*COLOR_TEXT), + md_bg_color = rgb(*eerieblack), #(0,0,0,1), + theme_text_color='Custom', + on_release=self.dismiss, + font_name=FONT_PATH + ) + ], + color_bg = rgb(*eerieblack), #(0,0,0,1), + overlay_color=(0,0,0,0), + background_color=(0,0,0,0) + ) + self.ids.text.text_color=rgb(*COLOR_TEXT) + self.ids.text.font_name=FONT_PATH + self.size=Window.size #('666sp','666sp') + # self. + # self.adaptive_height=True + + def draw(self): + from matplotlib import transforms + from PIL import Image as pImage + from PIL import ImageOps + tr = transforms.Affine2D().rotate_deg(90) + + + # buf = io.BytesIO() + # plt.ion() + odir=f'/home/ryan/komrade/data/maps/' + if not os.path.exists(odir): os.makedirs(odir) + ofn=os.path.join(odir,f't_{len(self.points)}.png') + plt.gca().invert_yaxis() + plt.savefig(ofn, format='png',transparent=True,pad_inches=0.1,bbox_inches = 'tight') + + # flip? + # im = pImage.open(ofn) + # im = im.rotate(90) + # im.save(ofn) + + if not self.img: + self.img= AsyncImage(source=ofn) + self.img.background_color=(0,0,0,0) + self.img.overlay_color=(0,0,0,0) + # self.img.texture.flip_horizontal() + self.img.pos_hint={'center_x':0.48,'center_y':0.5} + # self.img.size=Window.size + # self.img.texture = img + self.img.add_widget(self.label_layout,1) + self.layout.add_widget(self.img,1) + + else: + self.img.source=ofn + # self.img.size_hint=(1,1) + # self.img.width=Window.size[0] + # self.img.allow_stretch=True + + def add_point(self,lat,long,desc): + logger.info(f'adding point? {desc} {lat}, {long}') + # plt.text( + # long+3, + # lat-12, + # desc, + # horizontalalignment='left', + # transform=self.projection + # ) + import random + from komrade.constants import ALL_COLORS + color = random.choice(ALL_COLORS) + self.points+=[(lat,long,desc)] + + # point + plt.plot( + long, + lat, + '+', + markersize=25, + linewidth=7, + color=rgb(*color), + transform=ccrs.Geodetic(), + ) + + # line + if self.last_lat and self.last_long: + plt.plot( + [self.last_long, long], + [self.last_lat, lat], + color=rgb(*color), #self.color_line, + linewidth=7, marker='', + transform=ccrs.Geodetic(), + ) + + + desc = '\n'.join(desc for lat,long,desc in self.points[-1:]) + #if self.label: + # self.img.remove_widget(self.label) + + self.label=label=MDLabel(text=desc) + label.color=rgb(*color) #self.color_label + label.font_name=FONT_PATH + label.font_size='20sp' + # label.size_hint=(1,1) + label.width=Window.size[0] + label.height='25sp' + label.valign='top' + # label.height='400sp' + # label.pos_hint = {'center_y':0.1+(0.1 * len(self.points))} + # label.pos = (0.5,0) + self.label_layout.add_widget(label) + + + + self.last_lat,self.last_long = lat,long + self.ax.set_global() + + + # wait and show + def open(self,maxwait=666,pulse=0.1): + self.draw() + super().open() + self.opened=True + # await asyncio.sleep(pulse) + # waited=0 + # while not self.ok_to_continue: + # await asyncio.sleep(pulse) + # waited+=pulse + # if waited>maxwait: break + # # logger.info(f'waiting for {waited} seconds... {self.ok_to_continue} {self.response}') + # return self.response + +default_places = { + 'Cambridge':(52.205338,0.121817), + 'Sydney':(-33.868820,151.209290), + 'New York':(40.712776,-74.005974), + 'Hong Kong':(22.278300,114.174700), + 'Cape Town':(-33.9249, 18.4241), + 'San Francisco':(37.774929,-122.419418), + 'Honolulu':(21.306944,-157.858337), + 'Tokyo':(35.689487,139.691711), + 'Ushuaia':(-54.801910,-68.302948), + 'Reykjavik':(64.126518,-21.817438) + +} + + +def test_map(): + map = MapWidget() + plt.show() + + +if __name__=='__main__': + + test_map() \ No newline at end of file diff --git a/komrade/backend/mazes.py b/komrade/backend/mazes.py index bb11c06..b503786 100644 --- a/komrade/backend/mazes.py +++ b/komrade/backend/mazes.py @@ -28,15 +28,22 @@ class MazeWalker(Handler): # print('! Found router:',record.msg % record.args) # print(router.ip,walk) # print() - + f=None if record.msg.startswith('Connecting to guard node'): f = self._callbacks.get('torpy_guard_node_connect') - if f: f(router) elif record.msg.startswith('Extending the circuit'): f = self._callbacks.get('torpy_extend_circuit') - if f: f(router) - - + + # import asyncio + # if f: + # asyncio.create_task(f(router)) + # + if f: + # texec = ThreadExecutor() + # texec(f, router) + # f(router) + import asyncio + asyncio.run(f(router)) pass diff --git a/komrade/backend/the_telephone.py b/komrade/backend/the_telephone.py index 0dc805d..5f16bf3 100644 --- a/komrade/backend/the_telephone.py +++ b/komrade/backend/the_telephone.py @@ -68,8 +68,8 @@ class TheTelephone(Operator): self.log("DIALING THE OPERATOR:",URL) # phonecall=await self.komrade_request_async(URL) - import asyncio - loop = asyncio.get_event_loop() + # import asyncio + # loop = asyncio.get_event_loop() texec = ThreadExecutor() # phonecall=self.komrade_request(URL) diff --git a/komrade/constants.py b/komrade/constants.py index d7a0f69..b4ded90 100644 --- a/komrade/constants.py +++ b/komrade/constants.py @@ -203,4 +203,196 @@ if not 'KOMRADE_USE_CLEARNET' in os.environ or not os.environ['KOMRADE_USE_CLEAR -FONT_PATH = os.path.join(PATH_GUI_ASSETS,'font.otf') \ No newline at end of file +FONT_PATH = os.path.join(PATH_GUI_ASSETS,'font.otf') + + + + + + + + + + + + + + + + + + + + + + + + + +#from p2p_api import +PORT_LISTEN = 5969 + +# NODES_PRIME = [("128.232.229.63",8467), ("68.66.241.111",8467)] +NODES_PRIME = [("128.232.229.63",8467)] + + + + + + + + + + + +DEFAULT_URI='/login/' + +import random,platform +HORIZONTAL = True # random.choice([True,True,True,False]) +FACTOR=1 +WINDOW_SIZE = (1136*FACTOR,640*FACTOR) if HORIZONTAL else (640*FACTOR,1136*FACTOR) + + +PLAYING_CARDS = (2.5,3.5) +ASPECT_RATIO = PLAYING_CARDS[0]/PLAYING_CARDS[1] +ASPECT_RATIO = 1/ASPECT_RATIO +HEIGHT = 850 + +if platform.platform().startswith('Linux'): + HEIGHT *= 1.25 + + +WINDOW_SIZE=int(HEIGHT),int(HEIGHT * ASPECT_RATIO) + +BG_IMG='assets/bg-brown.png' + +grass=(201,203,163) +russiangreen = (109,140,96) +huntergreen = (67,92,61) +kombugreen = (49,67,45) +pinetreegreen = (29,40,27) +junglegreen = (15, 21, 14) + +browncoffee=(77, 42, 34) +rootbeer=(38, 7, 1) +blackbean=(61, 12, 2) +burntumber=(132, 55, 34) +brownsugar=(175, 110, 81) +antiquebrass= (198, 144, 118) +royalbrown=(94, 55, 46) +bole=(113, 65, 55) +liver= (110, 56, 31) +bistre=(58, 33, 14) +bistre2=(43, 21, 7) +skin1=(89, 47, 42) +skin2=(80, 51, 53) +skin3=(40, 24, 26) + +grullo=177, 158, 141 +smokyblack=33, 14, 0 +liverchestnut=148, 120, 96 +ashgray=196, 199, 188 +livchestnut2=156, 106, 73 +beaver=165, 134, 110 +rawumber=120, 95, 74 + +persianred=202,52,51 +vermillion=126,25,27 +indianred=205,92,92 +barnred=124,10,2 +maroon=128,0,0 +bloodred=98, 23, 8 +rust=188, 57, 8 +darksienna=34, 9, 1 +yellowcrayola=246, 170, 28 +darkred=148, 27, 12 +rosewood=94, 11, 21 +redviolet=144, 50, 61 +bone=217, 202, 179 +bronze=188, 128, 52 +shadow=140, 122, 107 +orangered=194, 3, 3 + +dutchwhite=229,219,181 +# black=(0,0,0) +black=15, 15, 15 #5, 8, 13 + +eerieblack=23, 22, 20 +bistre=58, 38, 24 +tuscanred=117, 64, 67 +grullo2=154, 136, 115 +blackolive=55, 66, 61 + + +dogreen=103, 116, 35 +sage=187, 193, 145 +alabaster2 = 241, 236, 226 +coyotebrown = 138, 93, 61 +vandykebrown = 90, 62, 41 + +darksienna2=55, 6, 23 +xiketic=3, 7, 30 + +rossacorsa=208, 0, 0 +raisinblack=38, 34, 34 +coffee2=67, 58, 58 +rufusred=171, 4, 4 +darksienna3=56, 22, 13 + + +black2=0, 20, 39 +xanadu=112, 141, 129 +jasmine=244, 213, 141 +ioe=191, 6, 3 +dred=141, 8, 1 +caputmort1=74, 36, 25 + + +# SCHEME = 'lgreen' +# SCHEME = 'bronze' +SCHEME = 'dark' + + + +# light green theme? +if SCHEME=='lgreen': + COLOR_TOOLBAR= huntergreen #bone #smokyblack #5,5,5 #russiangreen #pinetreegreen #kombugreen #(12,5,5) #russiangreen + COLOR_BG = grass # russiangreen #(0,73,54) + COLOR_LOGO = coyotebrown # grass#russiangreen #(0,0,0) #(0,0,0) #(151,177,140) #(132,162,118) #(109,140,106) + COLOR_TEXT = black #(255,245,200) #(0,0,0,1) #(241,233,203) #COLOR_ICON #(207,219,204) #(239,235,206) # (194,211,187) # (171,189,163) # (222,224,198) # COLOR_LOGO #(223, 223, 212) + COLOR_CARD = bone #(67,92,61) #(12,9,10) + COLOR_CARD_BORDER = COLOR_CARD + COLOR_ICON=COLOR_LOGO + +elif SCHEME=='bronze': + COLOR_TOOLBAR= junglegreen + COLOR_BG = bronze + COLOR_LOGO = rufusred #yellowcrayola #0,0,0 + COLOR_TEXT = black + COLOR_CARD = bone + COLOR_CARD_BORDER = COLOR_CARD + COLOR_ICON=COLOR_LOGO + +else: + # COLOR_TOOLBAR= black + # COLOR_TOOLBAR=bronze + # COLOR_LOGO = black #bronze #0,0,0 + + + # COLOR_BG = black + COLOR_BG=bistre + COLOR_TOOLBAR=black + COLOR_LOGO=bronze + COLOR_TEXT = black + COLOR_CARD = bone + COLOR_CARD_BORDER = COLOR_CARD + COLOR_ICON=COLOR_LOGO + COLOR_ACCENT = huntergreen + + +COLOR_INACTIVE = COLOR_CARD +COLOR_ACTIVE = russiangreen + + +ALL_COLORS = list({v for (k,v) in globals().items() if type(v)==tuple and len(v)==3}) +