summaryrefslogblamecommitdiff
path: root/servergreps/hercules/src/reporter.py
blob: 74c2e50919afb267c571bfdd0ebe67f34518ced5 (plain) (tree)
1
2
3
4
5
6
7
8
9







                                                 
                                                                                            




















                                                                                                                
                                                                           






                                                                   
                                                                    



















































                                                                                                                                
                                                                                



















                                                                                                                    
                                                                       


































                                                                                                                       

                                                                             






























                                                                                                        















                                                                                  

                                       
                                                                                        























                                                                                                                                                






                                                                                                                       
 
 



                                                                                                                    



                                                                                                         



                                                                                                                   

 
























                                                                                                                   
#! /usr/bin/env python2
# -*- coding: utf8 -*-
#
# Copyright (C) 2015-2016  Evol Online
# Author: Andrei Karas (4144)

class Reporter:
    def reportManaplus(self, hercules, manaplus):
        with open(self.packetDir + "/" + hercules.reportName + "_outpackets.txt", "w") as w:
            for packet in hercules.outPacketsSorted:
                data = packet
                while data[0] == "0":
                    data = data[1:]
                if packet in manaplus.inPackets:
                    clientName = manaplus.inPackets[packet][0]
    #                if clientName not in manaplus.manaplusUsedPacketsSet and clientName.find("_OUTDATED") <= 0:
    #                    w.write("UNIMPLIMENTED ")
                    w.write(data + " client name: " + clientName)
                else:
                    w.write(data)
                w.write("\n")

        funcDict = dict()
        for packet in hercules.inPacketsSorted:
            data = packet
            while data[0] == "0":
                data = data[1:]
            if packet in hercules.inPackets:
                funcDict[hercules.inPackets[packet][1]] = packet

        with open(self.packetDir + "/client_uselesspackets.txt", "w") as w:
            for packet in manaplus.outPackets:
                if packet not in hercules.inPackets:
                    w.write("Useless packet {0}.\n".format(packet))

    #    manaplusFunc = set()
        rev = []

        with open(self.packetDir + "/client_packets.txt", "w") as w:
            for packet in manaplus.outPackets:
                clientName = manaplus.outPackets[packet][0]
                if clientName not in manaplus.manaplusUsedPacketsSet and clientName.find("_OUTDATED") <= 0:
                    w.write("PSESENT BUT UNIMPLIMENTED {0}\n".format(clientName))

    #        for packet in manaplus.outPackets:
    #            if packet in hercules.inPackets:
    #                manaplusFunc.add(hercules.inPackets[packet][1])
    #        for func in funcDict:
    #            if func not in manaplusFunc:
    #                packet = funcDict[func]
    #                rev.append("{0:4} {1:>4} {2}".format(packet, hercules.inPackets[packet][0], hercules.inPackets[packet][1]))

            clientSet = set()
            for packet in hercules.inPackets:
                clientSet.add(hercules.inPackets[packet][1])
            for packet in manaplus.outPackets:
                if packet in hercules.inPackets and hercules.inPackets[packet][1] in clientSet:
                    if manaplus.outPackets[packet][2] == hercules.inPackets[packet][1]:
                        clientSet.remove(hercules.inPackets[packet][1])
                    else:
                        if manaplus.outPackets[packet][2] in clientSet:
                            clientSet.remove(manaplus.outPackets[packet][2])

            allPackets = set()
            for packet in hercules.inPackets:
                allPackets.add(packet)
            for packet in manaplus.outPackets:
                allPackets.add(packet)

            for packet in clientSet:
                rev.append("{0:4} {1:33} {2}".format("?", "UNIMPLIMENTED", packet))

            for packet in allPackets:
                if packet not in manaplus.outPackets:
                    continue
                data = "{0:4} {1:33} ".format(packet, manaplus.outPackets[packet][0])
                if packet in hercules.inPackets:
                    if manaplus.outPackets[packet][2] == hercules.inPackets[packet][1]:
                        data = data + hercules.inPackets[packet][1]
                        rev.append(data)
                else:
                    data = data + "?"
                    rev.append(data)

            rev.sort()

            for data in rev:
                w.write(data)
                w.write("\n")

        rev = []
        with open(self.packetDir + "/client_wrongoutpacketsizes.txt", "w") as w:
            for name in manaplus.outMsgNameToId:
                packet = manaplus.outMsgNameToId[name]
    #        for packet in manaplus.outPackets:
                if packet in hercules.inPackets and manaplus.outPackets[packet][1] != hercules.inPackets[packet][0]:
                    packet1 = manaplus.outPackets[packet]
                    packet2 = hercules.inPackets[packet]
                    if packet2[0] != 0:
                        rev.append("{0:4} {1:33} {2:35} {3:4} vs {4:4}".format(
                            packet,
                            packet1[0],
                            packet2[1],
                            packet1[1],
                            packet2[0]))
            rev.sort()

            for data in rev:
                w.write(data)
                w.write("\n")

        rev = []
        with open(self.packetDir + "/client_badpackets.txt", "w") as w:
            for name in manaplus.outMsgNameToId:
                packet = manaplus.outMsgNameToId[name]
    #        for packet in manaplus.outPackets:
                if packet in hercules.inPackets:
                    packet1 = manaplus.outPackets[packet]
                    packet2 = hercules.inPackets[packet]
                    if packet1[2] in hercules.functionToId:
                        data = hercules.functionToId[packet1[2]]
                        data2 = hercules.functionToId[packet2[1]]
                        if data2 == packet:
                            if packet1[2] != packet2[1]:
                                rev.append("{0:4} {1:33} client: {2:35} server: {3:35} Change id to {4}".format(packet,
                                    packet1[0],
                                    packet1[2],
                                    packet2[1],
                                    data))
                        else:
                            # here hidden or previous packet
                            pass
                    else:
                        data = "unknown"
                        if packet1[2] != packet2[1]:
                            rev.append("{0:4} {1:33} client: {2:35} server: {3:35} Change id to {4}".format(packet,
                                packet1[0],
                                packet1[2],
                                packet2[1],
                                data))

            rev.sort()

            for data in rev:
                w.write(data)
                w.write("\n")

        rev = []
        with open(self.packetDir + "/client_preferredpackets.txt", "w") as w:
            with open(self.packetDir + "/client_badpackets.txt", "a+") as w2:
                for name in manaplus.outMsgNameToId:
                    packet = manaplus.outMsgNameToId[name]
                    if packet in hercules.inPackets:
                        packet1 = manaplus.outPackets[packet]
                        packet2 = hercules.inPackets[packet]
                        if packet1[0] != name:
                            # skip if same id used for other packet already
                            #print("{0}, {1}, {2}, {3}".format(name, packet, packet1, packet2))
                            w2.write("{0:4} {1:33} hidden by {2}\n".format(packet,
                                name,
                                packet1[2]))
                            continue
                        if packet1[2] in hercules.functionToId:
                            data = hercules.functionToId[packet1[2]]
                            if packet1[2] == packet2[1] and hercules.functionToId[packet1[2]] != packet:
                                rev.append("{0:4} -> {1:4}  {2:33} {3}".format(packet,
                                    data,
                                    packet1[0],
                                    packet1[2]))
                        else:
                            data = "unknown"
                            if packet1[2] == packet2[1] and hercules.functionToId[packet1[2]] != packet:
                                rev.append("{0:4} -> {1:4}  {2:33} {3}".format(packet,
                                    data,
                                    packet1[0],
                                    packet1[2]))
                rev.sort()
                for data in rev:
                    w.write(data)
                    w.write("\n")

        with open(self.packetDir + "/client_wronginpacketsizes.txt", "w") as w:
            for packet in hercules.getLenPackets:
                if packet in manaplus.sizes:
                    if hercules.knownLenPackets[packet] != manaplus.sizes[packet]:
                        w.write("{0:4} client={1:4} vs server={2:4}\n".format(
                            packet,
                            manaplus.sizes[packet],
                            hercules.knownLenPackets[packet]))
                else:
                    if packet in hercules.knownLenPackets:
                        w.write("{0:4} client=missing vs server={1:4}\n".format(
                            packet,
                            hercules.knownLenPackets[packet]))
                    else:
                        w.write("{0:4} client=missing vs server=missing\n".format(
                            packet))

    def reportHercules(self, hercules):
        with open(self.packetDir + "/" + hercules.reportName + "_issues.txt", "w") as w:
            for name in hercules.functionToId:
                packet = hercules.functionToId[name]
                if name != hercules.inPackets[packet][1]:
                    found = False
                    oldId = ""
                    for packet in hercules.inPackets:
                        if name == hercules.inPackets[packet][1]:
                            found = True
                            if oldId == "":
                                oldId = str(packet)
                            else:
                                oldId = oldId + "," + str(packet)
                    if found is False:
                        w.write("Server code error: function {0} hidden in server code\n".format(
                            name))
                    else:
                        w.write("Server code warning: function {0} hidden in server code but can be used older packets definition {1}\n".format(
                            name,
                            oldId))
        with open(self.packetDir + "/" + hercules.reportName + "_missing_sizes.txt", "w") as w:
            for packet in hercules.getLenPackets:
                if packet not in hercules.knownLenPackets:
                    w.write("Missing length for packet {0}\n".format(
                        packet))


    def reportRathena(self, hercules, rathena):
        with open(self.packetDir + "/" + hercules.reportName + "_" + rathena.reportName + "_outpackets.txt", "w") as w:
            for packet in rathena.outPacketsSorted:
                if packet not in hercules.packetsSet:
                    w.write("Exists only in rAthena: " + packet + "\n")


    def reportHerculesFork(self, hercules, fork, name):
        with open(self.packetDir + "/" + hercules.reportName + "_" + fork.reportName + "_outpackets.txt", "w") as w:
            for packet in fork.outPacketsSorted:
                if packet not in hercules.packetsSet:
                    if packet in fork.getLenPackets and packet not in fork.knownLenPackets:
                        w.write("Exists only in " + name + ", but missing packet size: " + packet + "\n")
                    else:
                        w.write("Exists only in " + name + ": " + packet + "\n")
        with open(self.packetDir + "/" + hercules.reportName + "_" + fork.reportName + "_inpackets.txt", "w") as w:
            for packet in fork.inPacketsSorted:
                if packet not in hercules.inPackets:
                    w.write("Exists only in " + name + ": " + packet + "\n")


    def reportServer(self, hercules, server):
        with open(self.packetDir + "/" + hercules.reportName + "_" + server.dirName + "_outpackets.txt", "w") as w:
            for packet in server.outPacketsSorted:
                if packet not in hercules.outPacketsSorted:
                    w.write("Exists only in " + server.dirName + ": " + packet + "\n")
        with open(self.packetDir + "/" + hercules.reportName + "_" + server.dirName + "_inpackets.txt", "w") as w:
            for packet in server.inPacketsSorted:
                if packet not in hercules.inPacketsSorted:
                    w.write("Exists only in " + server.dirName + ": " + packet + "\n")
        with open(self.packetDir + "/" + server.dirName + "_" + hercules.reportName + "_outpackets.txt", "w") as w:
            fail = False
            for packet in hercules.outPacketsSorted:
                if packet not in server.outPackets:
                    fail = True
                    w.write("Exists only in Hercules: " + packet + "\n");
            if fail == False:
                w.write("Server include all hercules packets\n")
        with open(self.packetDir + "/" + server.dirName + "_" + hercules.reportName + "_inpackets.txt", "w") as w:
            fail = False
            for packet in hercules.inPacketsSorted:
                if packet not in server.inPackets:
                    fail = True
                    w.write("Exists only in Hercules: " + packet + "\n");
            if fail == False:
                w.write("Server include all hercules packets\n")