laneya

multiplayer roguelike game
git clone https://git.ce9e.org/laneya.git

commit
bd244f98e446e9d42d6265e3339b68dde7060c4a
parent
693d480267073becb7504b0b063b25fb520cda4c
Author
Tobias Bengfort <tobias.bengfort@gmx.net>
Date
2014-10-04 10:01
Merge branch 'feature-validation'

Diffstat

A docs/source/actions.rst 5 +++++
M docs/source/index.rst 1 +
A laneya/actions.py 16 ++++++++++++++++
M laneya/protocol.py 22 ++++++++++++++++++++++

4 files changed, 44 insertions, 0 deletions


diff --git a/docs/source/actions.rst b/docs/source/actions.rst

@@ -0,0 +1,5 @@
   -1     1 Available actions
   -1     2 =================
   -1     3 
   -1     4 .. automodule:: laneya.actions
   -1     5     :members:

diff --git a/docs/source/index.rst b/docs/source/index.rst

@@ -9,6 +9,7 @@ Contents
    9     9 
   10    10     quickstart
   11    11     protocol
   -1    12     actions
   12    13     deferred
   13    14 
   14    15 Indices and tables

diff --git a/laneya/actions.py b/laneya/actions.py

@@ -0,0 +1,16 @@
   -1     1 """Collection of available actions.
   -1     2 
   -1     3 This module describes the available actions.  The actions are modelled as
   -1     4 functions that may perform arbitrary validation on the incoming data.
   -1     5 
   -1     6 The actual processing of actions happens in the server and client.
   -1     7 
   -1     8 """
   -1     9 
   -1    10 
   -1    11 def echo(foo=''):
   -1    12     """Example server action."""
   -1    13 
   -1    14 
   -1    15 def other(foo=''):
   -1    16     """Example client action."""

diff --git a/laneya/protocol.py b/laneya/protocol.py

@@ -68,6 +68,7 @@ from twisted.python import log
   68    68 from twisted.protocols.basic import NetstringReceiver
   69    69 
   70    70 import deferred as q
   -1    71 import actions
   71    72 
   72    73 
   73    74 key = 0
@@ -129,13 +130,30 @@ class Protocol(JSONProtocol):
  129   130 
  130   131         return self._sendResponse(key, 'success', **response)
  131   132 
   -1   133     def validate_message(self, message, expected_keys):
   -1   134         if sorted(message.keys()) != expected_keys:
   -1   135             log.err('Invalid message: %s' % message)
   -1   136             raise InvalidError
   -1   137 
   -1   138     def validate_action(self, action, data):
   -1   139         try:
   -1   140             fn = getattr(actions, action)
   -1   141             fn(**data)
   -1   142         except:
   -1   143             log.err('Invalid action: %s %s' % (action, data))
   -1   144             raise InvalidError
   -1   145 
  132   146     def jsonReceived(self, message):
  133   147         if message['type'] == 'request':
   -1   148             self.validate_message(message, ['action', 'data', 'key', 'type'])
   -1   149             self.validate_action(message['action'], message['data'])
  134   150             self._requestReceived(
  135   151                 message['key'],
  136   152                 message['action'],
  137   153                 **message['data'])
   -1   154 
  138   155         elif message['type'] == 'response':
   -1   156             self.validate_message(message, ['data', 'key', 'status', 'type'])
  139   157             key = message['key']
  140   158             if key in self._responseDeferreds:
  141   159                 response = {
@@ -147,8 +165,12 @@ class Protocol(JSONProtocol):
  147   165                     d.resolve(response)
  148   166                 else:
  149   167                     d.reject(response)
   -1   168 
  150   169         elif message['type'] == 'update':
   -1   170             self.validate_message(message, ['action', 'data', 'type'])
   -1   171             self.validate_action(message['action'], message['data'])
  151   172             self.updateReceived(message['action'], **message['data'])
   -1   173 
  152   174         else:
  153   175             log.err('Message type not known: %s' % message['type'])
  154   176