########################################################################################
# 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]