66import zlib
77import random
88import threading
9+ import hashlib
910
1011from rich import print
1112from rich .console import Console
1213from rich .tree import Tree
1314from rich .align import Align
1415
16+ from anonfile import AnonFile
17+
1518global buffer
1619
1720# Vars
1821console = Console ()
22+ anon = AnonFile ()
1923s = socket .socket ()
2024buffer = 1024
2125
22-
2326"""
2427def cls:
2528 Clear terminal screen
@@ -33,7 +36,6 @@ def cls():
3336 else :
3437 os .system ("clear" )
3538
36-
3739class API :
3840 """
3941 class Chat:
@@ -137,10 +139,10 @@ def banner(self):
137139 def get_server (self ):
138140
139141 server_ip = console .input (
140- "[b]Insert server address[/b] [purple]>>[/purple] " )
142+ "[b]Insert server address[/b] :laptop_computer: : " )
141143
142144 server_port = int (
143- console .input ("[b]Insert server port[/b] [purple]>>[/purple] " ))
145+ console .input ("[b]Insert server port[/b] : " ))
144146
145147 # If server_ip == "local"... change server_ip to 127.0.0.1
146148
@@ -152,13 +154,18 @@ def get_server(self):
152154
153155 def get_username (self ):
154156 username = console .input (
155- "[b]Insert your username[/b] [purple]>>[/purple] " )
157+ "[b]Insert your username[/b] :ID: : " )
156158
157159 # Random color set
158160 color = self .random_color ()
159161 username_styled = f"<[{ color } ]{ username } [/{ color } ]>"
160162 return username , username_styled
161163
164+ def get_password (self ):
165+ password = console .input ("[b]Insert password[/b] :locked_with_key: : " )
166+ # Encrypt password
167+ return hashlib .md5 (password .encode ()).hexdigest ()
168+
162169 def start (self ):
163170 self .banner ()
164171 ip , port = self .get_server ()
@@ -187,6 +194,14 @@ def __init__(self, chat_api, username_styled, username) -> None:
187194 self .username_styled = username_styled
188195 self .username = username
189196
197+ def help_cmd (self ):
198+ docs = """
199+ /help show the command list
200+ /nick show your nickname
201+ /upload upload your file
202+ """
203+ print (docs )
204+
190205 def receive (self ):
191206 while True :
192207 try :
@@ -197,21 +212,40 @@ def receive(self):
197212 def write (self ):
198213 try :
199214 while True :
200- msg = input ()
201-
202- # Remove line up
203- sys .stdout .write ("\033 [F" )
215+ msg = input ("" )
216+ try :
217+ msg_splited = msg .split ()
218+
219+ # Remove line up
220+ sys .stdout .write ("\033 [F" )
221+
222+ if (len (msg_splited [0 ].strip ()) > 0 ):
223+ if msg_splited [0 ] == "/help" :
224+ self .help_cmd ()
225+
226+ elif msg_splited [0 ] == "/nick" :
227+ print (self .username )
228+
229+ elif msg_splited [0 ] == "/upload" :
230+ try :
231+ upload = anon .upload (msg_splited [1 ], progressbar = False )
232+ print ("<[green][i]You[/i][/green]>" + " [b]Upload: [/b] " + str (upload .url .geturl ()))
233+ self .chat_api .send (self .username_styled + " [b]Upload:[/b] " + str (upload .url .geturl ()))
234+ except IndexError :
235+ print ("Usage: /upload <path>" )
236+ except FileNotFoundError :
237+ print ("File not found" )
238+
239+ elif not msg_splited [0 ].startswith ("/" ):
240+ self .chat_api .send (self .username_styled + " " + msg )
241+
242+ print ("<[green][i]You[/i][/green]> " + msg )
243+ except IndexError :
244+ pass
204245
205- if (len (msg .strip ()) > 0 ):
206- match msg :
207- case "/nick" :
208- print (self .username )
209- case _:
210- self .chat_api .send (self .username_styled + " " + msg )
211-
212- print ("<[green][i]You[/i][/green]> " + msg )
213246 except KeyboardInterrupt :
214247 s .send ("/exit" .encode ())
248+ sys .exit (1 )
215249
216250 def run (self ):
217251 receive_process = threading .Thread (target = self .receive )
@@ -234,6 +268,9 @@ def get_buffer:
234268 def get_welcome_message:
235269 Get welcome message from server
236270
271+ def send_password:
272+ Send password for login on server
273+
237274 def run:
238275 Where the code will start
239276 """
@@ -242,18 +279,28 @@ def __init__(self) -> None:
242279 pass
243280
244281 def connect (self ):
282+ ui = UI ()
245283 while True :
246284 try :
247285 s .connect ((self .ip , self .port ))
248286 except ConnectionRefusedError :
249287 cls ()
250288 print ("[red]ERROR[/red]: Connection refused" )
251- UI = Main .UI ()
252- self .ip , self .port = UI .get_server ()
253- self .username , self .username_styled = UI .get_username ()
289+ self .ip , self .port = ui .get_server ()
290+ self .username , self .username_styled , = ui .get_username ()
291+ is_protected = s .recv (1024 ).decode ()
292+ if is_protected == "protected" :
293+ self .password = ui .get_password ()
294+ self .send_password (self .password )
295+
254296 else :
255297 break
256298
299+ is_protected = s .recv (1024 ).decode ()
300+ if is_protected == "protected" :
301+ self .password = ui .get_password ()
302+ self .send_password (self .password )
303+
257304 # Send username to server and wait 0.5s
258305 self .send_username (self .username )
259306 time .sleep (0.5 )
@@ -289,18 +336,26 @@ def send_username(self, username: str):
289336 s .close ()
290337 quit ()
291338
339+ def send_password (self , password : str ):
340+ s .send (password .encode ())
341+ confirm = s .recv (1024 ).decode ()
342+ # Confirm: /exit or /accepted
343+ if confirm != "/accepted" :
344+ print ("[red]ERROR[/red]: Incorrect password" )
345+ s .close ()
346+ quit ()
347+
292348 def get_buffer (self ):
293349 return int (s .recv (buffer ).decode ())
294350
295351 def get_welcome_message (self ):
296- print (Align (self .chat_api .recv (1024 ), "center" ))
352+ print (Align (self .chat_api .recv (buffer ), "center" ))
297353
298354 def run (self ):
299355 ui = UI ()
300356 self .ip , self .port , self .username , self .username_styled = ui .start ()
301357 self .connect ()
302358
303-
304359if __name__ == "__main__" :
305360 main = Main ()
306361 main .run ()
0 commit comments