Skip to content
This repository was archived by the owner on Oct 25, 2021. It is now read-only.

Commit 7be1997

Browse files
committed
Ajout de la fonctionnalité de quicklogin + meilleur support des erreurs
1 parent a142f7d commit 7be1997

File tree

1 file changed

+95
-11
lines changed

1 file changed

+95
-11
lines changed

AmtenaelLauncher.py

+95-11
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from hashlib import md5
55
# import de la verification de hash md5
66
import os
7+
import socket
78

89
try:
910
import requests
@@ -13,6 +14,7 @@
1314

1415
try:
1516
from tkinter import *
17+
from tkinter import messagebox
1618
# import de tkinter pour faire des fenetres
1719
except ImportError:
1820
print("Erreur a l'import de tkinter, Est-il installé ? Utilisez-vous Python 3.x ?")
@@ -25,7 +27,7 @@
2527
print("On dirait que AmtenaelLauncher n'est pas dans un dossier avec une installation valide de Dark Age of Camelot")
2628
exit(-1)
2729

28-
version = "1.2"
30+
version = "1.3"
2931

3032

3133
class CheckFiles:
@@ -82,7 +84,7 @@ def __init__(self, master):
8284
self.serveraddr = StringVar()
8385
self.server = Entry(master, state="disabled", textvariable=self.serveraddr)
8486
self.serveraddr.set("game.amtenael.fr")
85-
# creation d'un Entry pour l'addresse du serveur (non changeable mais present)
87+
# creation d'un Entry pour l'addresse du serveur (non changeable mais present dans le cas d'un fork (TODO))
8688

8789
self.fucktkinter0 = Label(master)
8890
# pour faire de la place
@@ -104,9 +106,13 @@ def __init__(self, master):
104106
self.connect_button = Button(master, text="Connexion", command=self.connect)
105107
# bouton de connexion qui appelle la fonction connect()
106108

107-
self.rememberpasswordvar = IntVar()
108-
self.rememberpassword = Checkbutton(master, text="Se souvenir des identifiants ?", var=self.rememberpasswordvar)
109+
# self.rememberpasswordvar = IntVar()
110+
# self.rememberpassword = Checkbutton(master, text="Se souvenir des identifiants ?", var=self.rememberpasswordvar)
111+
# self.rememberpassword.configure(state='normal')
109112
# Bouton pour savoir si on mémorise le user/mdp
113+
# les checkbutton ne fonctionnent pas sur ma machine de test, cette fonctionnalité attendra (désolé :p) TODO
114+
115+
self.charList = Listbox(master)
110116

111117
self.fucktkinterlol.pack()
112118
self.server.pack()
@@ -116,14 +122,75 @@ def __init__(self, master):
116122
self.password.pack()
117123
self.fucktkinter2.pack()
118124
self.connect_button.pack()
125+
# self.rememberpassword.pack()
126+
self.charList.pack()
119127
# On pack tout
120128

121-
self.checkCreds()
129+
self.token = "AmtenaelLinux" # on prépare la variable qui sera modifié pendant preconnect()
130+
131+
self.checkCreds() # on verifie que les identifiants ne sont pas sauvegardé
132+
self.preconnect() # peupler charList avant d'afficher la fenetre
133+
self.charList.insert(0, "Selection de royaume") # On ajoute la premiere ligne
122134

123135
def connect(self):
124-
print("Connexion avec", self.username.get(), "sur Amtenael")
125-
os.system("wine connect.exe game.dll "+self.server.get()+" "+self.username.get()+" "+self.password.get())
136+
try:
137+
charListSelect = self.charList.get(self.charList.curselection())
138+
except TclError:
139+
charListSelect = "Selection de royaume"
140+
# Ici on récupere la selection de l'utilisateur, si il n'a rien selectionné on l'ennemene a la selection de royaume
126141

142+
if self.username.get() != "" and self.password.get() != "":
143+
print("Connexion avec", self.username.get(), "sur Amtenael")
144+
145+
if charListSelect == "Selection de royaume":
146+
os.system("wine connect.exe game.dll " + self.server.get() + " " + self.username.get() + " " + self.password.get())
147+
else:
148+
os.system("wine connect.exe game.dll " + self.server.get() + " " + self.username.get() + " " + self.token + " " + charListSelect)
149+
# Ici on execute connect.exe (avec wine) sois vers la selection du royaume soit en connexion directe sur un personnage
150+
151+
# if self.rememberpasswordvar.get() == 1:
152+
# with open("launcher.dat", "a") as f:
153+
# f.write("AmtenaelLauncher-linux\n"+self.username.get()+"\n"+self.password.get()+"\n")
154+
# # sauvegarder les identifiants
155+
# f.close()
156+
else:
157+
messagebox.showerror("Erreur", "Veuillez rentrer un nom d'utilisateur et un mot de passe")
158+
159+
def preconnect(self):
160+
if self.username.get() != "" and self.password.get() != "":
161+
nl = "\n"
162+
uniqueId="AmtenaelLauncher-linux\\"+version
163+
tosend = self.username.get().encode("utf-8") + nl.encode("utf-8") + self.password.get().encode("utf-8") + \
164+
nl.encode("utf-8") + uniqueId.encode("utf-8") + nl.encode("utf-8")
165+
# ici nous preparons la requete a faire au serveur
166+
167+
# Et maintenant voici l'instant documentation en plein milieu du code du launcher:
168+
169+
# la requete doit ressembler a ca:
170+
# {Nom d'utilisateur}\n
171+
# {Mot de passe}\n
172+
# {Identifiant Unique}\n (sur windows il est constitué de l'identifiant du processeur+identifiant du disque dur)
173+
#
174+
# et la reponse ressemble a ceci:
175+
# {token} (permet la connection direct a un personnage et remplace le mot de passe dans ce cas)
176+
# {Nom d'un personnage} {Royaume} (ceci répété pour chaque personnage, {Royaume} est 1, 2 ou 3 pour faciliter la connection avec connect.exe
177+
178+
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
179+
s.connect((self.server.get(), 10301))
180+
s.send(tosend)
181+
# On envoie au serveur la requete
182+
183+
char = s.recv(1024).decode().splitlines()
184+
# on recupere la réponse du serveur, et on la transforme directement en string
185+
s.close()
186+
# et on oublie pas de fermer la connection et on va s'en servir pour remplir le widget charList
187+
188+
self.token = char[0] # on a besoin de la premiere ligne pour se connecter plus tard
189+
i = 1 # ignorer la premiere ligne
190+
while i < len(char):
191+
self.charList.insert(i, char[i])
192+
193+
i+=1
127194

128195
def checkCreds(self):
129196
try:
@@ -132,17 +199,34 @@ def checkCreds(self):
132199
self.usernamevar.set(lines[1])
133200
self.passwordvar.set(lines[2])
134201
print("Mot de passe pour", lines[1], "trouvé")
135-
self.rememberpassword.toggle()
202+
# self.rememberpassword.toggle()
136203
f.close()
137204
except FileNotFoundError or KeyError:
138205
print("Aucun mot de passe enregistré")
139-
try:
140-
CheckFiles()
141-
# Verifions les fichiers avant d'afficher le launcher
142206

207+
208+
try:
143209
root = Tk()
144210
window = AmtenaelLauncher(root)
211+
212+
CheckFiles()
213+
# On vérifie les fichiers avant d'afficher le launcher
214+
145215
root.mainloop()
146216
# On lance la fenetre
147217
except KeyboardInterrupt:
148218
exit(0)
219+
except requests.exceptions.SSLError as e:
220+
print(e)
221+
messagebox.showerror("Erreur", "Le certificat SSL de la réponse de amtenael.fr n'est pas correct, changez la variable SSLImportant au début du fichier pour ne pas vérifier le certificat")
222+
except requests.exceptions.HTTPError as e:
223+
print(e)
224+
messagebox.showerror("Erreur", "AmtenaelLauncher a reçu un code de réponse HTTP invalide")
225+
exit(-1)
226+
except requests.exceptions.ConnectionError as e:
227+
print(e)
228+
messagebox.showerror("Erreur", "AmtenaelLauncher n'a pas été capable de recuperer les fichiers depuis amtenael.fr")
229+
exit(-1)
230+
except IOError as e:
231+
print(e)
232+
messagebox.showerror("Erreur", "AmtenaelLauncher n'a pas été capapble d'écrire ou de lire sur le disque dur")

0 commit comments

Comments
 (0)