summaryrefslogblamecommitdiff
path: root/protocol.py
blob: 9f2154d2d94a68843aab99ca44261a90625b29d8 (plain) (tree)



















                                                                                        
            
             
                            
                                    


                                                             
                                                                              



                                  
                                                                              



                                                           
             
 



                                                                              

                                  













                                                                              

                                                                             


                                                 
 
                                                                              





                                    


                                    



                                     



                                        






                            
 
########################################################################################
#     This file is part of Spheres.
#     Copyright (C) 2019  Jesusalva

#     This library is free software; you can redistribute it and/or
#     modify it under the terms of the GNU Lesser General Public
#     License as published by the Free Software Foundation; either
#     version 2.1 of the License, or (at your option) any later version.

#     This library is distributed in the hope that it will be useful,
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#     Lesser General Public License for more details.

#     You should have received a copy of the GNU Lesser General Public
#     License along with this library; if not, write to the Free Software
#     Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
########################################################################################
# Protocol Module
# Parses packets
import utils
import player
import battle.main as battle
from consts import ERR_BAD, ERR_DONE

# self.data structure: <Token> ; <Message> ; <JSON Arguments>
def parse(packet):
    ##########################################################################
    # Maybe it is a RAW packet
    if (packet.lower() == "ping"):
        return [True, "PONG"]

    ##########################################################################
    # Not a raw packet, so it must adhere to the convention
    data=packet.split(';')
    if (len(data) != 3):
        return [False, "Invalid packet (RAW)"]
    t=data[0]

    ##########################################################################
    # Maybe it is an honest login attempt, or a registration attempt
    if data[1] == "login":
        # TODO: Create a token
        if t == "0":
            t=utils.create_token()
        r=player.get_data(data[2], t)
        if r is ERR_BAD:
            return [False, "Login error"]
        else:
            return [True, r]
    elif data[1] == "register":
        r=player.register(data[2], t)
        if r is ERR_BAD:
            return [False, "Invalid registration attempt"]
        else:
            return [True, r]

    ##########################################################################
    # It is not, so Validate token format
    print("Data0: %s | Alpnum: %s" % (str(data[0]), str(data[0].isalnum()) ))
    if not data[0].isalnum():
        return [False, "Invalid packet (TOKENF)"]

    # TODO: Now validate the token itself

    ##########################################################################
    # Top level protocols
    if data[1] == "logout":
        player.clear(t)
        r=ERR_DONE
    elif data[1] == "get_inv":
        r=player.get_inv(data[2], t)
    elif data[1] == "battle":
        r=battle.battle(data[2], t)
    elif data[1] == "reload_battle":
        try:
            r=battle.reload_battle(t)
        except:
            r=[True, "CANCELLED"]
    elif data[1] == "begin_quest":
        r=battle.begin_quest(data[2], t)
    elif data[1] == "get_party":
        r=player.get_party(data[2], t)
    else:
        r=ERR_BAD

    if r == ERR_BAD:
        return [True, "ACK"]
    else:
        return [True, r]