136 lines
5.7 KiB
Python
136 lines
5.7 KiB
Python
import time
|
|
from constants import *
|
|
from PyQt4 import QtGui
|
|
from os.path import exists
|
|
from pybass_constants import *
|
|
|
|
def handlePackets(caller, total, record=True):
|
|
# Record the packet if demos enabled
|
|
if record and caller.parent.demoRecorder:
|
|
caller.parent.demoRecorder.record(total)
|
|
|
|
for network in total:
|
|
header = network[0]
|
|
if header == 'MS':
|
|
if len(network) < 15:
|
|
print '[warning]', 'Malformed/incomplete MS packet was received'
|
|
continue
|
|
|
|
if isinstance(network[CHATMSG], unicode):
|
|
network[CHATMSG] = decodeAOString(network[CHATMSG])
|
|
else:
|
|
network[CHATMSG] = decodeAOString(network[CHATMSG].decode('utf-8'))
|
|
|
|
caller.MS_Chat.emit(network)
|
|
|
|
elif header == 'MC':
|
|
music = decodeAOString(network[1])
|
|
charid = int(network[2])
|
|
t = time.localtime()
|
|
timestamp = "[%d:%.2d] " % (t[3], t[4]) if not caller.parent.demoPlaying else ""
|
|
if charid != -1:
|
|
try:
|
|
name = caller.parent.charList[charid][0]
|
|
except:
|
|
name = 'char id %d' % charid
|
|
|
|
if len(network) > 3 and network[3]:
|
|
name += " ("+network[3].decode("utf-8")+")"
|
|
caller.IC_Log.emit(timestamp + '%s changed the music to %s' % (name, music))
|
|
else:
|
|
caller.IC_Log.emit(timestamp + 'The music was changed to %s' % music)
|
|
caller.parent.playMusic(music)
|
|
|
|
elif header == 'BN':
|
|
caller.newBackground.emit(network[1].lower(), True)
|
|
|
|
elif header == 'CT':
|
|
name = decodeAOString(network[1].decode('utf-8'))
|
|
chatmsg = decodeAOString(network[2].decode('utf-8').replace("\n", "<br />"))
|
|
caller.OOC_Log.emit("<b>%s:</b> %s" % (name, chatmsg.replace("<", "<").replace("<br />","<br />") if len(network) > 3 and network[3] == "0" else chatmsg))
|
|
|
|
elif header == 'PV':
|
|
caller.newChar.emit(int(network[3]))
|
|
|
|
elif header == 'LE':
|
|
del network[0]
|
|
caller.loadAllEvidence.emit([evi.split('&') for evi in network])
|
|
|
|
elif header == 'ZZ':
|
|
# TODO: Remove from tcp thread
|
|
if caller.parent.modcall:
|
|
audio.freeHandle(caller.parent.modcall)
|
|
caller.parent.modcall = audio.loadHandle(0, "mod_call.wav", 0, 0, 0)
|
|
audio.setHandleAttr(caller.parent.modcall, BASS_ATTRIB_VOL, caller.parent.sliSoundVolume.value() / 100.0)
|
|
audio.playHandle(caller.parent.modcall, False)
|
|
|
|
if len(network) > 1:
|
|
caller.OOC_Log.emit('<b>[MOD CALL] ' + network[1].replace("\n", "<br />") + '</b>')
|
|
else:
|
|
caller.OOC_Log.emit('<b>[MOD CALL] But there was no extra information. (old server?)</b>')
|
|
|
|
elif header == 'CharsCheck':
|
|
del network[0]
|
|
caller.charSlots.emit(network)
|
|
|
|
elif header == 'RT':
|
|
testimony = network[1]
|
|
variant = int(network[2]) if testimony == 'judgeruling' else 0
|
|
caller.parent.wtceSignal.emit(testimony, variant)
|
|
|
|
elif header == 'HP':
|
|
kind = int(network[1])
|
|
health = int(network[2])
|
|
caller.parent.healthbars.emit(kind, health)
|
|
|
|
elif header == 'KK':
|
|
# TODO: Show message from GUI thread
|
|
reason = network[1]
|
|
caller.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You were kicked from the server. (%s)' % reason)
|
|
|
|
elif header == 'KB':
|
|
# TODO: Show message from GUI thread
|
|
reason = network[1]
|
|
caller.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'critical', 'Connection lost', 'You have been banned from the server. (%s)' % reason)
|
|
|
|
elif header == 'BB': # message popup (AO 2.9)
|
|
# TODO: Show message from GUI thread
|
|
message = network[1]
|
|
caller.parent.emit(QtCore.SIGNAL('showMessage(QString, QString, QString)'), 'information', 'Message from server', message)
|
|
|
|
elif header == 'AUTH': # login status (AO 2.9)
|
|
caller.authStatusChanged.emit(int(network[1]))
|
|
|
|
# elif header == "CHECK": #ping
|
|
# pingafter = time.time()
|
|
# caller.parent.gotPing.emit(int((pingafter - pingbefore)*1000))
|
|
|
|
elif header == 'DONE':
|
|
caller.showCharSelect.emit()
|
|
|
|
elif header == 'PR':
|
|
del network[0]
|
|
caller.updatePlayerList.emit(network[0], 0, int(network[1]), "")
|
|
|
|
elif header == 'PU':
|
|
del network[0]
|
|
caller.updatePlayerList.emit(network[0], 1, int(network[1]), network[2].decode('utf-8'))
|
|
|
|
elif header == 'ARUP':
|
|
del network[0]
|
|
caller.updateAreaList.emit(network)
|
|
|
|
elif header == 'TI':
|
|
del network[0]
|
|
timer_id = int(network[0])
|
|
command = int(network[1])
|
|
time_ms = 0
|
|
if len(network) == 3:
|
|
time_ms = int(network[2])
|
|
|
|
caller.timerUpdate.emit(command, timer_id, time_ms)
|
|
|
|
# For demos
|
|
elif header == 'SC':
|
|
del network[0]
|
|
caller.setCharList.emit([ [char.split('&')[0].decode('utf-8'), 0, "male", True ] for char in network ]) |