preliminary wss support

This commit is contained in:
cidoku 2025-06-19 18:22:55 -04:00
parent 75c248ff9b
commit 6044f350dd
3 changed files with 40 additions and 24 deletions

View File

@ -2,6 +2,7 @@ import socket
import platform import platform
import websocket import websocket
import ssl
from constants import * from constants import *
@ -63,9 +64,18 @@ class AOwebSocket(object):
"User-Agent": "AO2XP %s, Python %s, %s %s %s" % (GAME_VERSION, platform.python_version(), platform.system(), platform.release(), platform.machine()) "User-Agent": "AO2XP %s, Python %s, %s %s %s" % (GAME_VERSION, platform.python_version(), platform.system(), platform.release(), platform.machine())
} }
def connect(self, ip, port): def connect(self, ip, port, secure_port):
try: try:
self.sock.connect("ws://%s:%s" % (ip, port), header=self.header) if secure_port:
try:
print "[debug]", "Trying secure websocket..."
self.sock.connect("wss://%s:%s" % (ip, secure_port), header=self.header)
except:
print "[debug]", "Connecting to secure websocket failed. Trying websocket..."
self.sock.connect("ws://%s:%s" % (ip, port), header=self.header)
else:
print "[debug]", "Trying websocket..."
self.sock.connect("ws://%s:%s" % (ip, port), header=self.header)
except: except:
return False return False

View File

@ -20,6 +20,7 @@ Features added since the last commit of [Headshot's AO2XP](https://github.com/he
- Demo recording and playback with a seekbar, no need to send messages to OOC - Demo recording and playback with a seekbar, no need to send messages to OOC
- Pair with players directly from the player list - Pair with players directly from the player list
- Playing music over HTTPS (on systems where the BASS library can't do it on its own) - Playing music over HTTPS (on systems where the BASS library can't do it on its own)
- Connections over secure websockets (wss)
- FLAC music support - FLAC music support
- MIDI music support (needs a soundfount file named `gm.sf2` in the root AO2XP directory) - MIDI music support (needs a soundfount file named `gm.sf2` in the root AO2XP directory)
- Module music support (MOD, XM, IT, S3M) - Module music support (MOD, XM, IT, S3M)

View File

@ -118,7 +118,7 @@ class lobby(QtGui.QWidget):
self.onlineplayers = QtGui.QLabel(self) self.onlineplayers = QtGui.QLabel(self)
self.onlineplayers.setStyleSheet('color: white') self.onlineplayers.setStyleSheet('color: white')
self.onlineplayers.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignTop) self.onlineplayers.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignTop)
self.onlineplayers.setText(random.choice(['hi', 'oh, welcome back', 'hello', 'click on a server to begin', 'yo, how you doing?'])) self.onlineplayers.setText(random.choice(['Hi', 'Oh, welcome back', 'Hello', 'Click on a server to begin', 'Yo, how are you doing?']))
self.onlineplayers.move(336, 91) self.onlineplayers.move(336, 91)
self.onlineplayers.resize(173, 16) self.onlineplayers.resize(173, 16)
@ -196,8 +196,8 @@ class lobby(QtGui.QWidget):
self.masterserver.start() self.masterserver.start()
if not demo and self.autoconnect: if not demo and self.autoconnect:
self.aoserverinfo.setIP(self.autoconnect[-1], self.autoconnect[0], self.autoconnect[1], self.autoconnect[2]) self.aoserverinfo.setIP(self.autoconnect[-1], self.autoconnect[0], self.autoconnect[1], self.autoconnect[2], self.autoconnect[3])
print '[debug]', 'Connecting automatically to ip: ' + self.autoconnect[0] + ', port: ' + str(self.autoconnect[1]) + ", websocket port: " + str(self.autoconnect[2]) print '[debug]', 'Connecting automatically to ip: ' + self.autoconnect[0] + ', port: ' + str(self.autoconnect[1]) + ", websocket port: " + str(self.autoconnect[2]) + ", websocket port: " + str(self.autoconnect[3])
self.aoserverinfo.stop() self.aoserverinfo.stop()
self.aoserverinfo.start() self.aoserverinfo.start()
@ -218,10 +218,11 @@ class lobby(QtGui.QWidget):
ip = server["ip"] ip = server["ip"]
port = server["port"] port = server["port"]
ws_port = server["ws_port"] if "ws_port" in server else 0 ws_port = server["ws_port"] if "ws_port" in server else 0
wss_port = server["wss_port"] if "wss_port" in server else 0
serveritem = QtGui.QListWidgetItem(name) serveritem = QtGui.QListWidgetItem(name)
if self.tab == 0: self.serverlist.addItem(serveritem) if self.tab == 0: self.serverlist.addItem(serveritem)
self.actual_serverlist.append((ip, port, name, desc, ws_port)) self.actual_serverlist.append((ip, port, name, desc, ws_port, wss_port))
def moveToGame(self, stuff): def moveToGame(self, stuff):
tcp, playerlist, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, webAO_bucket = stuff tcp, playerlist, charlist, musiclist, background, evidence, areas, features, joinooc, hplist, webAO_bucket = stuff
@ -283,15 +284,16 @@ class lobby(QtGui.QWidget):
ip = self.actual_serverlist[i][0] ip = self.actual_serverlist[i][0]
port = str(self.actual_serverlist[i][1]) port = str(self.actual_serverlist[i][1])
name = self.actual_serverlist[i][2] name = self.actual_serverlist[i][2]
ws = self.actual_serverlist[i][-1] ws = self.actual_serverlist[i][4]
ws = self.actual_serverlist[i][5]
for sv in self.favoriteslist: for sv in self.favoriteslist:
if sv[0] == ip and sv[1] == port: if sv[0] == ip and sv[1] == port:
return QtGui.QMessageBox.information(self, "Error", "This server already exists in your favorites list, named '%s'" % sv[2]) return QtGui.QMessageBox.information(self, "Error", "This server already exists in your favorites list, named '%s'" % sv[2])
self.favoriteslist.append([ip, port, ws, name]) self.favoriteslist.append([ip, port, ws, wss, name])
with open(AOpath+'serverlist.txt', "a") as file: with open(AOpath+'serverlist.txt', "a") as file:
file.write("%s:%s:%s:%s\n" % (ip, port, ws, name)) file.write("%s:%s:%s:%s:%s\n" % (ip, port, ws, wss, name))
file.close() file.close()
def onClicked_connect(self): def onClicked_connect(self):
@ -341,12 +343,11 @@ class lobby(QtGui.QWidget):
if self.serverlist.item(i) == item: if self.serverlist.item(i) == item:
if self.tab == 0: if self.tab == 0:
self.serverinfo.setText(self.actual_serverlist[i][3]) self.serverinfo.setText(self.actual_serverlist[i][3])
self.aoserverinfo.setIP(text, self.actual_serverlist[i][0], self.actual_serverlist[i][1], self.actual_serverlist[i][-1]) self.aoserverinfo.setIP(text, self.actual_serverlist[i][0], self.actual_serverlist[i][1], self.actual_serverlist[i][4], self.actual_serverlist[i][5])
print '[debug]', 'ind: ' + str(i) + ', ip: ' + self.actual_serverlist[i][0] + ', port: ' + str(self.actual_serverlist[i][1]) + ", websocket port: " + str(self.actual_serverlist[i][-1]) print '[debug]', 'ind: ' + str(i) + ', ip: ' + self.actual_serverlist[i][0] + ', port: ' + str(self.actual_serverlist[i][1]) + ", websocket port: " + str(self.actual_serverlist[i][4]) + ", secure websocket port: " + str(self.actual_serverlist[i][5])
elif self.tab == 1: elif self.tab == 1:
self.aoserverinfo.setIP(text, self.favoriteslist[i][0], self.favoriteslist[i][1], self.favoriteslist[i][2]) self.aoserverinfo.setIP(text, self.favoriteslist[i][0], self.favoriteslist[i][1], self.favoriteslist[i][2], self.favoriteslist[i][3])
print '[debug]', 'ind: ' + str(i) + ', ip: ' + self.favoriteslist[i][0] + ', port: ' + str(self.favoriteslist[i][1]) + ", websocket port: " + str(self.favoriteslist[i][2]) print '[debug]', 'ind: ' + str(i) + ', ip: ' + self.favoriteslist[i][0] + ', port: ' + str(self.favoriteslist[i][1]) + ", websocket port: " + str(self.favoriteslist[i][2]) + ", secure websocket port: " + str(self.favoriteslist[i][3])
self.aoserverinfo.stop() self.aoserverinfo.stop()
self.aoserverinfo.start() self.aoserverinfo.start()
@ -404,15 +405,18 @@ class AOServerInfo(QtCore.QThread):
self.ip = "" self.ip = ""
self.port = 0 self.port = 0
self.ws_port = 0 self.ws_port = 0
self.wss_port = 0
self.name = "jm" self.name = "jm"
self.webAO_bucket = "" self.webAO_bucket = ""
self.useWS = False self.useWS = False
self.connected = False
self.disconnect = False self.disconnect = False
def setIP(self, name, ip, port, ws_port=0): def setIP(self, name, ip, port, ws_port=0, wss_port=0):
self.ip = ip self.ip = ip
self.port = int(port) self.port = int(port)
self.ws_port = int(ws_port) self.ws_port = int(ws_port)
self.wss_port = int(wss_port)
self.name = name self.name = name
def stop(self): def stop(self):
@ -423,21 +427,21 @@ class AOServerInfo(QtCore.QThread):
def run(self): def run(self):
self.disconnect = False self.disconnect = False
self.tcp = AOsocket.AOwebSocket()
try: try:
if self.ws_port == 0: raise Exception # make it jump to except: and use TCP if self.ws_port == 0 and self.wss_port == 0: raise Exception # make it jump to except: and use TCP
print "[debug]", "trying websocket..." self.tcp = AOsocket.AOwebSocket()
self.tcp.connect(self.ip, self.ws_port) self.connected = self.tcp.connect(self.ip, self.ws_port, self.wss_port)
except: except:
self.tcp = AOsocket.AOtcpSocket() self.tcp = AOsocket.AOtcpSocket()
try: try:
print "[debug]", "trying TCP..." print "[debug]", "Trying TCP..."
self.tcp.connect(self.ip, self.port) self.connected = self.tcp.connect(self.ip, self.port)
except: except:
self.setOnlinePlayers.emit("couldn't retrieve players") self.setOnlinePlayers.emit("Couldn't retrieve players")
return return
print "[debug]", "connected! websocket: %s" % self.tcp.isWS print "[debug]", "Connected! websocket: %s" % self.tcp.isWS
self.tcp.sock.settimeout(0.1) self.tcp.sock.settimeout(0.1)
got_stuff = False got_stuff = False
@ -498,7 +502,8 @@ class AOServerInfo(QtCore.QThread):
got_stuff = True got_stuff = True
elif header == "decryptor": elif header == "decryptor":
self.tcp.send("HI#AO2XP %s#%%" % hardware.get_hdid()) #self.tcp.send("HI#AO2XP %s#%%" % hardware.get_hdid())
self.tcp.send("HI#%s#%%" % hardware.get_hdid())
elif header == "ASS": # ha ha ha... elif header == "ASS": # ha ha ha...
self.webAO_bucket = network[1] self.webAO_bucket = network[1]