diff options
-rwxr-xr-x | servergreps/hercules/packets.py | 6 | ||||
-rwxr-xr-x | servergreps/hercules/src/peek.py | 107 | ||||
-rwxr-xr-x | servergreps/hercules/src/reporter.py | 42 |
3 files changed, 155 insertions, 0 deletions
diff --git a/servergreps/hercules/packets.py b/servergreps/hercules/packets.py index 9290160..39b8d3e 100755 --- a/servergreps/hercules/packets.py +++ b/servergreps/hercules/packets.py @@ -10,6 +10,7 @@ from src.brathena import Brathena from src.hercules import Hercules from src.idathena import Idathena from src.manaplus import ManaPlus +from src.peek import Peek from src.ragemu import Ragemu from src.rathena import Rathena from src.reporter import Reporter @@ -53,6 +54,9 @@ server2014 = Server() tables = Tables() tables.dirName = "tables" tables.reportName = "tables" +peek = Peek() +peek.dirName = "peek"; +peek.reportName = "peek" manaplus = ManaPlus() reporter = Reporter() @@ -73,6 +77,7 @@ idathena.processPackets("idathena", packetDir, packetVersion) server2013.processPackets("server2013") server2014.processPackets("server2014") tables.processPackets("tables", packetDir, packetVersion) +peek.processPackets("peek", packetDir, packetVersion) manaplus.processPackets(packetVersion); reporter.reportManaplus(hercules, manaplus) @@ -85,3 +90,4 @@ reporter.reportHerculesFork(hercules, idathena, "idAthena") reporter.reportServer(hercules, server2013) reporter.reportServer(hercules, server2014) reporter.reportTables(hercules, tables) +reporter.reportPeek(hercules, peek) diff --git a/servergreps/hercules/src/peek.py b/servergreps/hercules/src/peek.py new file mode 100755 index 0000000..3012987 --- /dev/null +++ b/servergreps/hercules/src/peek.py @@ -0,0 +1,107 @@ +#! /usr/bin/env python2 +# -*- coding: utf8 -*- +# +# Copyright (C) 2015-2016 Evol Online +# Author: Andrei Karas (4144) + +import configparser +import re +import os + +class Peek: + inPacketsSorted = [] + inPackets = dict() + knownLenPackets = dict() + + shuffleMap = { + '0': 'clif->pActionRequest', + '1': 'clif->pUseSkillToId', + '2': 'clif->pWalkToXY', + '3': 'clif->pTickSend', + '4': 'clif->pChangeDir', + '5': 'clif->pTakeItem', + '6': 'clif->pDropItem', + '7': 'clif->pMoveToKafra', + '8': 'clif->pMoveFromKafra', + '9': 'clif->pUseSkillToPos', + '10': 'clif->pUseSkillToPosMoreInfo', + '11': 'clif->pGetCharNameRequest', + '12': 'clif->pSolveCharName', + '13': 'clif->pSearchStoreInfoListItemClick', + '14': 'clif->pSearchStoreInfoNextPage', + '15': 'clif->pSearchStoreInfo', + '16': 'clif->pReqTradeBuyingStore', + '17': 'clif->pReqClickBuyingStore', + '18': 'clif->pReqCloseBuyingStore', + '19': 'clif->pReqOpenBuyingStore', + '20': 'clif->pPartyBookingRegisterReq', + '21': 'clif->pDull // CZ_JOIN_BATTLE_FIELD', # CZ_JOIN_BATTLE_FIELD + '22': 'clif->pItemListWindowSelected', + '23': 'clif->pWantToConnection', + '24': 'clif->pPartyInvite2', + '25': 'clif->pDull // CZ_GANGSI_RANK', # CZ_GANGSI_RANK + '26': 'clif->pFriendsListAdd', + '27': 'clif->pHomMenu', + '28': 'clif->pStoragePassword' + } + + def collectInPackets(self, packetsH): + config = configparser.ConfigParser() + config.read(packetsH) + cfg = config["Packet_Lengths"] + for key in cfg: + data = key[2:].lower() + while len(data) < 4: + data = "0" + data + self.inPackets[data] = \ + (int(cfg[key]), "") + self.knownLenPackets[data] = int(cfg[key]) + cfg = config["Shuffle_Packets"] + for key in cfg: + data = key[2:].lower() + while len(data) < 4: + data = "0" + data + shuffle = cfg[key] + if shuffle in self.shuffleMap: + packet = self.inPackets[data] + self.inPackets[data] = (packet[0], self.shuffleMap[shuffle]) + else: + print "Not found shuffle code {0}".format(shuffle) + + def sortInPackets(self): + for packet in self.inPackets: + self.inPacketsSorted.append(packet) + self.inPacketsSorted.sort() + + + def findVersion(self, srcPath, packetDir): + name = packetDir[:4] + "-" + packetDir[4:6] + "-" + packetDir[6:8] + files = os.listdir(srcPath) + for file1 in files: + if file1[0] == ".": + continue + file2 = os.path.abspath(srcPath + os.path.sep + file1) + if os.path.isdir(file2) and file1.find(name) >= 0: + srcPath = file2 + files = os.listdir(srcPath) + for file1 in files: + if file1[0] == ".": + continue + file2 = os.path.abspath(srcPath + os.path.sep + file1) + if os.path.isfile(file2): + self.collectInPackets(file2) + self.sortInPackets() + return + + def processPackets(self, codeDir, packetDir, packetVersion): +# namedPacketsPath = packetDir + "/src/" + self.dirName + "/packets_struct.h" + srcPath = "../links/" + self.dirName +# packetsDbPath = "../links/" + codeDir + "/db/packet_db.txt" +# serverInPacketsHPath = packetDir + "/src/" + self.dirName + "/packets.h" +# serverLoginInPackets = packetDir + "/src/" + self.dirName + "/lclif.c" +# serverCharPackets = packetDir + "/src/" + self.dirName + "/char.c" +# self.collectNamedPackets(namedPacketsPath) +# self.collectOutPackets(srcPath) + self.findVersion(srcPath, packetDir) +# self.collectCharInPackets(serverCharPackets); +# self.sortOutPackets() diff --git a/servergreps/hercules/src/reporter.py b/servergreps/hercules/src/reporter.py index ddaec38..fb287ce 100755 --- a/servergreps/hercules/src/reporter.py +++ b/servergreps/hercules/src/reporter.py @@ -340,3 +340,45 @@ class Reporter: w.write("Exists only in Hercules: " + packet + "\n"); if fail == False: w.write("Server include all hercules packets\n") + + + def reportPeek(self, hercules, peek): + if len(peek.inPacketsSorted) == 0: + return + with open(self.packetDir + "/" + hercules.reportName + "_" + peek.dirName + "_inpackets.txt", "w") as w: + for packet in peek.inPacketsSorted: + if packet not in hercules.inPacketsSorted and packet not in hercules.outPacketsSorted: + w.write("Exists only in " + peek.dirName + ": " + packet + "\n") + for packet in peek.inPacketsSorted: + if packet in hercules.inPacketsSorted and packet in peek.inPackets and packet in hercules.knownLenPackets: + if hercules.knownLenPackets[packet] != peek.knownLenPackets[packet]: + w.write("Different packet size for packet {0}: {1} vs {2}\n".format( + packet, + hercules.knownLenPackets[packet], + peek.knownLenPackets[packet])) + with open(self.packetDir + "/" + peek.dirName + "_" + hercules.reportName + "_inpackets.txt", "w") as w: + fail = False + for packet in hercules.inPacketsSorted: + if packet not in peek.inPackets: + fail = True + w.write("Exists only in Hercules: " + packet + "\n"); + if fail == False: + w.write("Table include all hercules packets\n") + for packet in hercules.inPacketsSorted: + if packet in peek.inPackets: + peekFunction = peek.inPackets[packet][1] + if peekFunction != "": + herculesFunction = hercules.inPackets[packet][1] + if peekFunction != herculesFunction: + w.write("Wrong function name for packet {0}: {1} vs {2}\n".format( + packet, + peekFunction, + herculesFunction)) + with open(self.packetDir + "/" + peek.dirName + "_" + hercules.reportName + "_outpackets.txt", "w") as w: + fail = False + for packet in hercules.outPacketsSorted: + if packet not in peek.inPackets: + fail = True + w.write("Exists only in Hercules: " + packet + "\n"); + if fail == False: + w.write("Server include all hercules packets\n") |