Pycord/client/client.py
2023-10-20 16:19:57 +02:00

424 lines
18 KiB
Python

import npyscreen
from fonctions import *
import time
from os import system
import curses.ascii
import threading
class Thread_messages(threading.Thread):
def __init__(self, messages ,nom = '',):
threading.Thread.__init__(self)
self.nom = nom
self.Messages = messages
self.Terminated = False
def run(self):
update = 0
while not self.Terminated:
status = charger_message(self.Messages.group_id)
if status[0] == False:
return
message_list = status[2]
if len(message_list) > update:
update = len(message_list)
self.Messages.values = []
for i in message_list:
message = ''
message = str(i[1]) +' '+ str(i[3])
self.Messages.values.append(message)
self.Messages.values.append(str(i[2]))
self.Messages.values.append("")
self.Messages.display()
time.sleep(1)
def stop(self):
self.Terminated = True
class MyApplication(npyscreen.NPSAppManaged):
def onStart(self):
self.pseudo = ''
self.user_id = 0
self.list_ami = []
self.list_group = []
self.logo ="""
██████╗░██╗░░░██╗░░░░░░░█████╗░░█████╗░██████╗░██████╗░
██╔══██╗╚██╗░██╔╝░░░░░░██╔══██╗██╔══██╗██╔══██╗██╔══██╗
██████╔╝░╚████╔╝░█████╗██║░░╚═╝██║░░██║██████╔╝██║░░██║
██╔═══╝░░░╚██╔╝░░╚════╝██║░░██╗██║░░██║██╔══██╗██║░░██║
██║░░░░░░░░██║░░░░░░░░░╚█████╔╝╚█████╔╝██║░░██║██████╔╝
╚═╝░░░░░░░░╚═╝░░░░░░░░░░╚════╝░░╚════╝░╚═╝░░╚═╝╚═════╝░
"""
self.addForm('POST_CO', Menu_principal, name='PY-CORD')
self.addForm('SIGNUP',Menu_Inscription, name = 'PY-CORD')
self.addForm('LOGIN', Menu_Connexion, name='PY-CORD')
self.addForm('MAIN', Menu_accueil, name='PY-CORD')
def change_form(self, name):
self.switchForm(name)
self.resetHistory()
class InputBox(npyscreen.BoxTitle):
_contained_widget = npyscreen.MultiLineEdit
"""
class NewMultiLineClass(npyscreen.MultiLine):
def __init__(self):
super(MultiLineEdit, self).__init__(screen, **keywords)
self.group_index = None
self.group_id = []
"""
class GroupeBox(npyscreen.BoxTitle):
_contained_widget = npyscreen.MultiLine
class MessageBox(npyscreen.BoxTitle):
_contained_widget = npyscreen.MultiLine
class Menu_principal(npyscreen.FormBaseNewWithMenus):
def create(self):
"""
liste_ami = ['neo','Segpa'] // liste a afficher
liste_ami.id_list = [None,7] // liste des id de groupe
liste_ami.group_index = None // l'index du group actuel
message.group_id // id du groupe actuel
"""
self.commandes = {
'/help' : self.print_help,
'/ajouter_ami' : self.add_to_friend,
'/creer_groupe' : self.new_group,
'/ajouter_dans_groupe' : self.add_to_group,
'/suprimer_du_groupe' : self.remove_from_group,
'/changer_groupe' : self.change_current_grp_cmd,
}
y , x = self.useable_space()
############################################
# #
# Creation des widgets #
# #
############################################
# old self.profil = self.add(npyscreen.BoxTitle, name='profil',rely= 2,relx= 2, max_width = (x//4), max_height = (y//4) - 2 )
# old self.liste_ami= self.add(GroupeBox, name = 'amis/groupe',rely= y - (y//4*3),max_width = x//4)
self.liste_ami = self.add(GroupeBox, name = 'amis/groupe',rely= 2,relx= 2,max_width = x//4 - 15)
self.boite_texte = self.add(InputBox, name = "Partagez votre savoir",rely= y - (y//8) ,relx= x - (x//4 * 3) -14 )
self.Messages = self.add(MessageBox, name='grp',rely= 2,relx= x - (x//4 * 3) - 14 ,max_width = x//4 * 3 - 9, max_height = y - (y//8) - 2 )
self.liste_user = self.add(GroupeBox, name = 'membres',rely= 2,relx= x - x//10, max_height = y - (y//8) - 2)
self.liste_ami.group_index = None
self.Messages.group_id = None
self.thread = ""
#
#self.liste_ami.handlers.update({27:self.change_current_grp})
self.liste_ami.handlers.update({curses.ascii.NL :self.test }) # curses.ascii.NL means the New Line key (Enter)
self.liste_ami.add_handlers({"^H" :self.change_current_grp })
self.boite_texte.add_handlers({"^S" :self.send_message })
self.boite_texte.handlers[curses.ascii.NL] = self.send_message
############################################
# #
# Gestion des menu #
# #
############################################
self.m1 = self.add_menu(name='Menu utilisateur',shortcut='^M')
self.m1.addItemsFromList([
('Deconnection',self.change_to_main,"d",),
('DEBUG',self.debug,'Q'),
('Aide',self.print_help,'Q'),
('Fermer ce menu',self.change_to_post_co,"f")
])
self.m4 = self.m1.addNewSubmenu(name='supprimer un ami')
self.m2 = self.add_menu(name='Menu groupe',shortcut='^G')
self.m2.addItemsFromList([
('retirer un ami dans le groupe',self.change_to_post_co,'g'),
('Suprimer le groupe',self.change_to_post_co,"f")
])
self.m3 = self.m2.addNewSubmenu(name='Ajouter un ami dans le groupe')
############################################
# #
# Gestion des amis #
# #
############################################
def update_menu_amis(self):
liste_ajout_ami_grp = []
liste_retait_ami = []
for i in range(len(self.liste_ami.values)):
if self.liste_ami.id_list[i] == None:
liste_ajout_ami_grp.append((self.liste_ami.values[i], self.add_to_group, None ,None,(str(self.liste_ami.values[i]),)))
liste_retait_ami.append((self.liste_ami.values[i], self.remove_from_friend, None ,None,(str(self.liste_ami.values[i]),)))
self.m3.addItemsFromList(liste_ajout_ami_grp)
self.m4.addItemsFromList(liste_retait_ami)
def update_liste_amis(self):
self.liste_ami.id_list = []
self.liste_ami.group_index = None
self.liste_ami.values = []
amis = charger_amis(self.parentApp.user_id)
if amis[0]== True:
for i in amis[2]:
self.liste_ami.values.append(i)
self.liste_ami.id_list.append(None)
groupes = charger_groupe(self.parentApp.user_id)
if groupes[0] == True:
for i in groupes[2]:
self.liste_ami.values.append(i[0])
self.liste_ami.id_list.append(i[1])
self.update_menu_amis()
def add_to_friend(self,pseudo_ami):
status = ajouter_amis(self.parentApp.pseudo,pseudo_ami)
if status[0] == True:
npyscreen.notify_confirm(pseudo_ami + ' a été ajouté a vos amis')
self.update_liste_amis()
else:
npyscreen.notify_confirm(status[1])
def remove_from_friend(self,pseudo_ami):
status = retirer_amis(self.parentApp.pseudo,pseudo_ami)
if status[0] == True:
npyscreen.notify_confirm(pseudo_ami + ' a été retiré de vos amis')
self.update_liste_amis()
else:
npyscreen.notify_confirm(status[1])
############################################
# #
# Gestion des groupes #
# #
############################################
def change_current_grp_cmd(self,grp_name):
if grp_name in self.liste_ami.values:
valeur = self.liste_ami.values.index(grp_name)
if self.liste_ami.group_index != valeur :
self.liste_ami.group_index = valeur
self.Messages.name = self.liste_ami.values[self.liste_ami.group_index]
self.Messages.group_id = self.liste_ami.id_list[self.liste_ami.group_index]
#if self.Messages.group_id != None: self.load_messages()
self.Messages.display()
self.update_grp_member_list()
else:npyscreen.notify_confirm('Groupe introuvable')
def change_current_grp(self,wut):
if self.liste_ami.group_index != self.liste_ami.value :
self.liste_ami.group_index = self.liste_ami.value
self.Messages.name = self.liste_ami.values[self.liste_ami.group_index]
self.Messages.group_id = self.liste_ami.id_list[self.liste_ami.group_index]
#if self.Messages.group_id != None: self.load_messages()
self.Messages.display()
self.update_grp_member_list()
def new_group(self,nom_grp):
status = ajouter_dans_groupe(self.parentApp.pseudo,nom_grp)
if status[0] == True:
npyscreen.notify_confirm('Le groupe a été crée')
self.update_liste_amis()
else:
npyscreen.notify_confirm(status[1])
def remove_from_group(self,pseudo):
if self.Messages.group_id != None:
status = retirer_dans_groupe(pseudo,self.Messages.name)
npyscreen.notify_confirm(str(status[1]))
else:
npyscreen.notify_confirm("Selectionnez un groupe avant de performer cet operation")
def add_to_group(self, pseudo_ami):
if self.Messages.group_id != None:
status = ajouter_dans_groupe(pseudo_ami,self.Messages.name)
npyscreen.notify_confirm(str(status[1]))
else:
npyscreen.notify_confirm("Selectionnez un groupe avant de performer cet operation")
def update_grp_member_list(self):
if self.Messages.group_id != None:
status = charger_utilisateurs_groupe(int(self.Messages.group_id))
if not status[0]:
nptscreen.notify_confirm(str(status[1]))
return
#npyscreen.notify_confirm(str(status[2]))
for i in status[2]:
self.liste_user.values.append(i)
def debug(self):
npyscreen.notify_confirm([
f" nombre d'amis/groupe :{str(len(self.liste_ami.values))}",
f" d'amis/groupe : {str(self.liste_ami.values)}",
f" id des nombre d'amis/groupe :{str(self.liste_ami.id_list)}",
f" pseudo :{str(self.parentApp.pseudo)}",
f" id du groupe chargé : {str(self.Messages.group_id)}",
f" widget focused : {self.widget_focused()}",
f" membre du groupe charge : {self.liste_user.values}"
])
def widget_focused(self):
for i in self._widgets_by_id.keys():
if i == self.editw: return self._widgets_by_id[i].name
return 'pastrouvélol'
def test(self,wut):
npyscreen.notify_confirm('boo')
############################################
# #
# Gestion des messages #
# #
############################################
def send_message(self,wut):
if self.boite_texte.value[0] == '/':
commande = self.boite_texte.value.split()
if len(commande) > 1:
args = ''
for i in commande:
if '/' in i:pass
else:
args += i
try:
self.commandes[commande[0]](args)
self.boite_texte.value = ''
except:
npyscreen.notify_confirm('commande inexistante')
else:
try:
self.commandes[commande[0]]()
self.boite_texte.value = ''
except:
npyscreen.notify_confirm('commande inexistante')
else:
if self.thread != '':
self.thread.stop()
if self.Messages.group_id != None:
message = self.boite_texte.value
envoyer_message(self.parentApp.user_id,self.Messages.group_id,str(message))
self.boite_texte.value = ''
self.load_messages()
else:
pass
def load_messages_old(self):
status = charger_message(self.Messages.group_id)
if status[0] == False:
return
message_list = status[2]
self.Messages.values = []
for i in message_list:
message = ''
message = str(i[1]) +' '+ str(i[3])
self.Messages.values.append(message)
self.Messages.values.append(str(i[2]))
self.Messages.values.append("")
self.change_to_post_co()
def load_messages(self):
self.thread = Thread_messages(self.Messages)
self.thread.start()
######################################################
def print_help(self):
npyscreen.notify_confirm([
"A cause d'un soucis au niveau de la bibliotheque, pour charger les messages du groupe selectioné veuillez appuyer sur ctrl + h et pour envoyer un message ctrl + s",
"",
"",
"Commandes",
"Tab et shift + Tab pour changer le focus",
"/help : affiche cette pop up",
"/ajouter_ami [pseudo] : ajoute un utilisateur dans la liste d'amis",
"/creer_groupe [nom du groupe] : Crée un groupe",
'/changer_groupe [nom du groupe] : change le groupe actuel',
"/ajouter_dans_groupe [pseudo] : ajoute un utilisateur dans le groupe",
"/suprimer_du_groupe [pseudo] : supprime un utilisateur du groupe",
],'Aide',wrap = True,)
def change_to_main(self):
self.Messages.values = []
self.Messages.name = 'groupe'
self.parentApp.change_form('MAIN')
def change_to_post_co(self):
self.parentApp.change_form('POST_CO')
########################################################
class Menu_accueil(npyscreen.FormBaseNew):
def create(self):
y , x = self.useable_space()
self.add(InputBox, editable = False,value= self.parentApp.logo, max_width = 60,max_height=10, relx=(x//2) - 60 //2 )
self.add(npyscreen.ButtonPress, name="Connection", when_pressed_function=self.to_login,relx=(x//2) - 10 //2, rely= y//2 - 2)
self.add(npyscreen.ButtonPress, name="Inscription", when_pressed_function=self.to_signup,relx=(x//2) - 10 //2, rely= y//2 )
self.add(npyscreen.ButtonPress, name="Quitter", when_pressed_function=self.exit_application,relx=(x//2) - 10 //2, rely= y//2 + 2)
def to_login(self):
self.parentApp.change_form('LOGIN')
def to_signup(self):
self.parentApp.change_form('SIGNUP')
def exit_application(self):
self.parentApp.setNextForm(None)
self.editing = False
self.parentApp.switchFormNow()
class Menu_Connexion(npyscreen.ActionForm):
def create(self):
y , x = self.useable_space()
self.add(InputBox, editable = False, value = self.parentApp.logo, max_width = 60,max_height=10, relx=(x//2) - 60 //2 )
self.pseudo = self.add(npyscreen.TitleText, name='Pseudo:',relx=(x//3) - 10 //2, rely= y//2 - 2)
self.mot_de_passe = self.add(npyscreen.TitlePassword, name='Mot de passe:',relx=(x//3) - 10 //2, rely= y//2)
def on_ok(self):
etat = connexion(self.pseudo.value,self.mot_de_passe.value)
if etat[0] == True:
self.parentApp.pseudo = self.pseudo.value
self.parentApp.user_id = etat[2]
self.parentApp._Forms['POST_CO'].update_liste_amis()
npyscreen.notify_confirm('bienvenue '+ self.pseudo.value + '\n' + ' Entrée pour continuer')
self.parentApp.change_form('POST_CO')
else:
npyscreen.notify_confirm(etat[1])
self.pseudo.value = ''
self.mot_de_passe.value = ''
self.parentApp.change_form('LOGIN')
def on_cancel(self):
self.parentApp.change_form('MAIN')
class Menu_Inscription(npyscreen.ActionForm):
def create(self):
y , x = self.useable_space()
self.add(InputBox, editable = False, value = self.parentApp.logo, max_width = 60,max_height=10, relx=(x//2) - 60 //2 )
self.pseudo = self.add(npyscreen.TitleText, name='Pseudo:',relx=(x//3), rely= y//2 - 2)
self.mot_de_passe = self.add(npyscreen.TitlePassword, name='Mot de passe:',relx=(x//3), rely= y//2)
self.mot_de_passe_conf = self.add(npyscreen.TitlePassword, name='Confirmez le mdp:',relx=(x//3) - 10 //2, rely= y//2 + 2)
def on_ok(self):
etat = inscription(self.pseudo.value,self.mot_de_passe.value,self.mot_de_passe_conf.value)
if etat[0] == True:
npyscreen.notify_confirm('compte crée' + '\n' + ' Entrée pour continuer')
else:
npyscreen.notify_confirm(etat[1])
self.pseudo.value = ''
self.mot_de_passe.value = ''
self.mot_de_passe_conf.value = ''
def on_cancel(self):
self.parentApp.change_form('MAIN')
if __name__ == '__main__':
TestApp = MyApplication().run()