generator.py 3.68 KB
import os

ProtoCodeGO = './cmd/gameserver/action/protocode.go'
ProtoCodeGOTest = './cmd/test/action/protocode.go'
ProtoCodeFile = './protos/protocode.proto'
ProtoFileDir = "./protos"

ProtoCodeStr = "syntax = \"proto3\";\noption go_package = \"../pb;pb\";\n\npackage protocode;\n\nenum ProtoCode\n{{\n  " \
               "UNKNOWN = 0;\n {}\n}} "
ProtoCodeLineReq = "\t{}Rpc = {};\n"
ProtoCodeLineRsp = "\t{}Rsp = {};\n"

GoProtoCodeStr = "package action\n\nimport (\n\t\"pro2d/common/logger\"\n\t\"pro2d/pb\"\n)\n\nfunc GetActionMap() " \
                 "map[interface{{}}]interface{{}} {{\n\tlogger.Debug(\"init protocode...\")\n\tam := make(map[interface{{" \
                 "}}]interface{{}})\n{}\n\treturn am\n}}"
GoProtoCodeLine = "\tam[uint32(pb.ProtoCode_{}Rpc)] = {}Rpc\n"

GoProtoCodeTestStr = "package action\n\nimport (\n\t\"pro2d/pb\"\n)\n\nfunc GetTestActionMap() " \
                 "map[interface{{}}]interface{{}} {{\n\tam := make(map[interface{{" \
                 "}}]interface{{}})\n{}\n\treturn am\n}}"
GoProtoCodeTestReqLine = "\tam[uint32(pb.ProtoCode_{}Rpc)] = {}Rsp\n"
GoProtoCodeTestRspLine = "\tam[uint32(pb.ProtoCode_{}Rsp)] = {}Rsp\n"

def generatorProto(path):
    files = os.listdir(path)
    code = 0
    ProtoCodeData = ""
    GoCodeData = ""
    GoCodeTestData = ""
    for file in files:
        if file.find("account.proto") != -1:
            continue

        if os.path.isdir(file):
            continue

        with open(path + "/" + file, 'r', encoding='utf-8', errors='ignore') as f:
            lines = f.readlines()  # 读取所有行
            firstline = lines[0]
            if firstline.find("proto3") == -1:
                continue

            for line in lines:
                if line.find("message") == -1:
                    continue
                sline = line.split(' ')
                if len(sline) < 2:
                    continue

                messageStr = sline[1].replace('\n', '').replace('{', "")
                n1 = messageStr.find('Req')
                loginReq = messageStr.find('LoginReq')

                if n1 != -1:
                    code += 1
                    ProtoCodeData += ProtoCodeLineReq.format(messageStr[:n1], code)
                    if loginReq != -1:
                        continue
                    GoCodeData += GoProtoCodeLine.format(messageStr[:n1], messageStr[:n1])
                    GoCodeTestData += GoProtoCodeTestReqLine.format(messageStr[:n1], messageStr[:n1])

            ProtoCodeData += "\n"
            for line in lines:
                    if line.find("message") == -1:
                        continue
                    sline = line.split(' ')
                    if len(sline) < 2:
                        continue

                    messageStr = sline[1].replace('\n', '').replace('{', "")
                    n2 = messageStr.find('Rsp')
                    loginReq = messageStr.find('LoginReq')

                    if n2 != -1:
                        code += 1
                        ProtoCodeData += ProtoCodeLineRsp.format(messageStr[:n2], code)
                        if loginReq != -1:
                            continue
                        GoCodeTestData += GoProtoCodeTestRspLine.format(messageStr[:n2], messageStr[:n2])


    # protocode.go
    gostr = GoProtoCodeStr.format(GoCodeData)
    fo = open(ProtoCodeGO, "w")
    fo.write(gostr)
    fo.close()

    # protocode.go
    gostr = GoProtoCodeTestStr.format(GoCodeTestData)
    fo = open(ProtoCodeGOTest, "w")
    fo.write(gostr)
    fo.close()

    #protocode.proto
    protostr = ProtoCodeStr.format(ProtoCodeData)
    fo = open(ProtoCodeFile, "w")
    fo.write(protostr)
    fo.close()


if __name__ == "__main__":
    generatorProto(ProtoFileDir)