summaryrefslogtreecommitdiff
path: root/servergreps/hercules/packets.py
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2016-03-31 21:55:14 +0300
committerAndrei Karas <akaras@inbox.ru>2016-03-31 22:30:22 +0300
commit0732a6fe72c378bbac151749a0bab1a9dd7c1b8f (patch)
tree9710d72ead7d79c73c0551eba7fa3104831559bd /servergreps/hercules/packets.py
parent5f900444cdf2e55adfd1c55a83e5821082e36a7d (diff)
downloadevol-tools-0732a6fe72c378bbac151749a0bab1a9dd7c1b8f.tar.gz
evol-tools-0732a6fe72c378bbac151749a0bab1a9dd7c1b8f.tar.bz2
evol-tools-0732a6fe72c378bbac151749a0bab1a9dd7c1b8f.tar.xz
evol-tools-0732a6fe72c378bbac151749a0bab1a9dd7c1b8f.zip
servergreps: move scripts and output into hercules directory.
Diffstat (limited to 'servergreps/hercules/packets.py')
-rwxr-xr-xservergreps/hercules/packets.py221
1 files changed, 221 insertions, 0 deletions
diff --git a/servergreps/hercules/packets.py b/servergreps/hercules/packets.py
new file mode 100755
index 0000000..eb5f81a
--- /dev/null
+++ b/servergreps/hercules/packets.py
@@ -0,0 +1,221 @@
+#! /usr/bin/env python2.7
+# -*- coding: utf8 -*-
+#
+# Copyright (C) 2015 Evol Online
+# Author: Andrei Karas (4144)
+
+import os
+import re
+import sys
+
+filt = re.compile(".+[.]c", re.IGNORECASE)
+serverpacketre = re.compile("(WFIFOW|WBUFW)([ ]*)[(]([ ]*)([\w>_-]+),([ ]*)"
+ + "(?P<offset>0)([ ]*)[)]([ ]*)=([ ]*)0x(?P<packet>[0-9a-fA-F]+)([ ]*)[;]")
+serverpacketre2 = re.compile("[.]PacketType([ ]*)=([ ]*)(?P<name>[\w]+);")
+serverpacketre3 = re.compile("(WFIFOW|WBUFW)([ ]*)[(]([ ]*)([\w>_-]+),([ ]*)"
+ + "(?P<offset>0)([ ]*)[)]([ ]*)=([ ]*)(?P<packet>[0-9\w]+)([ ]*)[;]")
+# need remove SMSG_
+#protocolinre = re.compile("packet[(](?P<name>[A-Z0-9_]+),([ ]*)0x(?P<packet>[0-9a-fA-F]+)[)];")
+protocolinre = re.compile("packet[(](?P<name>[A-Z0-9_]+),([ ]*)0x(?P<packet>[0-9a-fA-F]+),([ ]*)(?P<len>[\w-]+),([ ]*)")
+protocoloutre = re.compile("packet[(](?P<name>CMSG_[A-Z0-9_]+),([ ]*)0x(?P<packet>[0-9a-fA-F]+)[)];")
+clientpacketre = re.compile("(\t*)packet[(]0x(?P<packet>[0-9a-fA-F]+),(?P<len>[\w-]+),(?P<function>[0-9a-zA-Z_>-]+)(,|[)])")
+packetNameClientre = re.compile("(?P<name>(S|C)MSG_[A-Z0-9_]+)")
+
+packetsSet = set()
+serverpacketsSorted = []
+clientpacketsSorted = []
+clientPacketsManaPlus = dict()
+clientPacketsManaPlusClient = dict()
+clientPackets = dict()
+sizes = dict()
+manaplusUsedPacketsSet = set()
+
+def collectServerPackets(parentDir):
+ global itemNamesByName
+ files = os.listdir(parentDir)
+ for file1 in files:
+ if file1[0] == ".":
+ continue
+ file2 = os.path.abspath(parentDir + os.path.sep + file1)
+ if not os.path.isfile(file2):
+ collectServerPackets(file2)
+ elif filt.search(file1):
+ with open(file2, "r") as f:
+ for line in f:
+ m = serverpacketre.findall(line)
+ if len(m) == 0:
+ m = serverpacketre3.findall(line)
+ if len(m) > 0:
+ for str in m:
+ if str[9] == "0":
+ continue
+ data = str[9]
+ while len(data) < 4:
+ data = "0" + data
+ packetsSet.add(data.lower())
+ m = serverpacketre2.findall(line)
+ if len(m) > 0:
+ for str in m:
+ if str[2] == "0":
+ continue
+ packetsSet.add(str[2].lower())
+
+def sortServerPackets():
+ for packet in packetsSet:
+ serverpacketsSorted.append(packet)
+ serverpacketsSorted.sort()
+
+def sortClientPackets():
+ for packet in clientPackets:
+ clientpacketsSorted.append(packet)
+ clientpacketsSorted.sort()
+
+def collectManaPlusPackets(fileName):
+ with open(fileName, "r") as f:
+ for line in f:
+ m = protocolinre.search(line)
+ if m is not None:
+ clientPacketsManaPlus[m.group("packet").lower()] = m.group("name")
+ sizes[m.group("packet").lower()] = m.group("len")
+ m = protocoloutre.search(line)
+ if m is not None:
+ clientPacketsManaPlus[m.group("packet").lower()] = m.group("name")
+ clientPacketsManaPlusClient[m.group("packet").lower()] = m.group("name")
+
+def collectClientPackets(fileName):
+ with open(fileName, "r") as f:
+ for line in f:
+ m = clientpacketre.search(line)
+ if m is not None:
+ data = m.group("packet").lower()
+ while len(data) < 4:
+ data = "0" + data
+ clientPackets[data] = (int(m.group("len")), m.group("function"));
+ #print "{0},{1},{2}".format(m.group("packet"), m.group("len"), m.group("function"))
+
+def collectManaPlusSizes(fileName):
+ cnt = 0
+ comaSplit = re.compile(",")
+ with open(fileName, "r") as f:
+ for line in f:
+ line = line.strip()
+ if len(line) < 2 or ((line[0] < "0" or line[0] > "9") and line[0] != "-"):
+ continue
+ cols = comaSplit.split(line)
+ for col in cols:
+ if col == "" or col == "\\":
+ continue
+ data = hex(cnt).split('x')[1]
+ while len(data) < 4:
+ data = "0" + data
+ sizes[data] = int(col)
+ cnt = cnt + 1
+# for d in range(0, 30):
+# s = ""
+# for f in range(0, 15):
+# s = s + "{0:>4},".format(sizes[f + d * 16])
+# print s
+
+def collectManaPlusUsedPackets(fileName):
+ with open(fileName, "r") as f:
+ for line in f:
+ m = packetNameClientre.search(line)
+ if m is not None:
+ manaplusUsedPacketsSet.add(m.group("name"))
+ #print m.group("name")
+
+def processManaPlusCppFiles(parentDir):
+ files = os.listdir(parentDir)
+ for file1 in files:
+ if file1[0] == ".":
+ continue
+ file2 = os.path.abspath(parentDir + os.path.sep + file1)
+ if not os.path.isfile(file2):
+ processManaPlusCppFiles(file2)
+ elif file1[-4:] == ".cpp":
+ collectManaPlusUsedPackets(file2)
+
+def printPackets():
+ with open(sys.argv[1] + "/serverpackets.txt", "w") as w:
+ for packet in serverpacketsSorted:
+ data = packet
+ while data[0] == "0":
+ data = data[1:]
+ if packet in clientPacketsManaPlus:
+ clientName = clientPacketsManaPlus[packet]
+# if clientName not in manaplusUsedPacketsSet and clientName.find("_OUTDATED") <= 0:
+# w.write("UNIMPLIMENTED ")
+ w.write(data + " client name: " + clientName)
+ else:
+ w.write(data)
+ w.write("\n")
+
+ funcDict = dict()
+ forRemove = []
+ for packet in clientpacketsSorted:
+ data = packet
+ while data[0] == "0":
+ data = data[1:]
+ if packet in clientPackets:
+ funcDict[clientPackets[packet][1]] = packet
+
+ with open(sys.argv[1] + "/uselesspackets.txt", "w") as w:
+ for packet in clientPacketsManaPlusClient:
+ if packet not in clientPackets:
+ w.write("Useless packet {0}.\n".format(packet))
+
+ manaplusFunc = set()
+ rev = []
+ with open(sys.argv[1] + "/clientpackets.txt", "w") as w:
+ for packet in clientPacketsManaPlusClient:
+ clientName = clientPacketsManaPlusClient[packet]
+ if clientName not in manaplusUsedPacketsSet and clientName.find("_OUTDATED") <= 0:
+ w.write("UNIMPLIMENTED {0}\n".format(clientName))
+
+ for packet in clientPacketsManaPlusClient:
+ if packet in clientPackets:
+ manaplusFunc.add(clientPackets[packet][1])
+ for func in funcDict:
+ if func not in manaplusFunc:
+ packet = funcDict[func]
+ rev.append("{0:4} {1:>4} {2}".format(packet, clientPackets[packet][0], clientPackets[packet][1]))
+ rev.sort()
+
+ for data in rev:
+ w.write(data)
+ w.write("\n")
+
+# with open(sys.argv[1] + "/wrongpackersizes.txt", "w") as w:
+# for packet in sizes:
+# if packet == "0000":
+# continue
+# data = packet
+# while data[0] == "0":
+# data = data[1:]
+# if packet in serverpacketsSorted:
+# if sizes[packet] != clientPackets[packet][0]:
+# w.write("{0:>4} {1:4} -> {2:4}\n".format(data, sizes[packet], clientPackets[packet][0]))
+
+def showHelp():
+ print("Usage: packets.py version");
+ exit(1)
+
+if len(sys.argv) != 2:
+ showHelp()
+
+srcPath = "../../../server-code/src/"
+manaplusPath = "../../../manaplus/src/"
+protocolPath = manaplusPath + "net/eathena/packets"
+clientPacketsPath = sys.argv[1] + "/packets.h"
+packetsPath = manaplusPath + "net/eathena/packetsin.inc"
+eathenaPath = manaplusPath + "net/eathena/"
+
+collectServerPackets(srcPath)
+collectClientPackets(clientPacketsPath)
+collectManaPlusPackets(protocolPath + "in.inc")
+collectManaPlusPackets(protocolPath + "out.inc")
+#collectManaPlusSizes(packetsPath);
+processManaPlusCppFiles(eathenaPath);
+sortClientPackets()
+sortServerPackets()
+printPackets()