aboutsummaryrefslogtreecommitdiff
path: root/diplomacy/utils/exceptions.py
diff options
context:
space:
mode:
Diffstat (limited to 'diplomacy/utils/exceptions.py')
-rw-r--r--diplomacy/utils/exceptions.py178
1 files changed, 178 insertions, 0 deletions
diff --git a/diplomacy/utils/exceptions.py b/diplomacy/utils/exceptions.py
new file mode 100644
index 0000000..4d564a3
--- /dev/null
+++ b/diplomacy/utils/exceptions.py
@@ -0,0 +1,178 @@
+# ==============================================================================
+# Copyright (C) 2019 - Philip Paquette, Steven Bocco
+#
+# This program is free software: you can redistribute it and/or modify it under
+# the terms of the GNU Affero General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option) any
+# later version.
+#
+# This program 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 Affero General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Affero General Public License along
+# with this program. If not, see <https://www.gnu.org/licenses/>.
+# ==============================================================================
+""" Exceptions used in diplomacy network code. """
+
+class DiplomacyException(Exception):
+ """ Diplomacy network code exception. """
+
+ def __init__(self, message=''):
+ self.message = (message or self.__doc__).strip()
+ super(DiplomacyException, self).__init__(self.message)
+
+class AlreadyScheduledException(DiplomacyException):
+ """ Cannot add a data already scheduled. """
+
+class CommonKeyException(DiplomacyException):
+ """Common key error."""
+
+ def __init__(self, key):
+ super(CommonKeyException, self).__init__('Forbidden common key in two dicts (%s)' % key)
+
+class KeyException(DiplomacyException):
+ """ Key error. """
+
+ def __init__(self, key):
+ super(KeyException, self).__init__('Key error: %s' % key)
+
+class LengthException(DiplomacyException):
+ """ Length error. """
+
+ def __init__(self, expected_length, given_length):
+ super(LengthException, self).__init__('Expected length %d, got %d.' % (expected_length, given_length))
+
+class NaturalIntegerException(DiplomacyException):
+ """ Expected a positive integer (int >= 0). """
+
+ def __init__(self, integer_name=''):
+ super(NaturalIntegerException, self).__init__(
+ ('Integer error: %s.%s' % (integer_name, self.__doc__)) if integer_name else '')
+
+class NaturalIntegerNotNullException(NaturalIntegerException):
+ """ Expected a strictly positive integer (int > 0). """
+
+class RandomPowerException(DiplomacyException):
+ """ No enough playable powers to select random powers. """
+
+ def __init__(self, nb_powers, nb_available_powers):
+ super(RandomPowerException, self).__init__('Cannot randomly select %s power(s) in %s available power(s).'
+ % (nb_powers, nb_available_powers))
+
+class TypeException(DiplomacyException):
+ """ Type error. """
+
+ def __init__(self, expected_type, given_type):
+ super(TypeException, self).__init__('Expected type %s, got type %s' % (expected_type, given_type))
+
+class ValueException(DiplomacyException):
+ """ Value error. """
+
+ def __init__(self, expected_values, given_value):
+ super(ValueException, self).__init__('Forbidden value %s, expected: %s'
+ % (given_value, ', '.join(str(v) for v in expected_values)))
+
+class NotificationException(DiplomacyException):
+ """ Unknown notification. """
+
+class ResponseException(DiplomacyException):
+ """ Unknown response. """
+
+class RequestException(ResponseException):
+ """ Unknown request. """
+
+class AdminTokenException(ResponseException):
+ """ Invalid token for admin operations. """
+
+class GameCanceledException(ResponseException):
+ """ Game was cancelled. """
+
+class GameCreationException(ResponseException):
+ """ Cannot create more games on that server. """
+
+class GameFinishedException(ResponseException):
+ """ This game is finished. """
+
+class GameIdException(ResponseException):
+ """ Invalid game ID. """
+
+class GameJoinRoleException(ResponseException):
+ """ A token can have only one role inside a game: player, observer or omniscient. """
+
+class GameMasterTokenException(ResponseException):
+ """ Invalid token for master operations. """
+
+class GameNotPlayingException(ResponseException):
+ """ Game not playing. """
+
+class GameObserverException(ResponseException):
+ """ Disallowed observation for non-master users. """
+
+class GamePhaseException(ResponseException):
+ """ Data does not match current game phase. """
+
+ def __init__(self, expected=None, given=None):
+ message = self.__doc__.strip()
+ # This is to prevent an unexpected Pycharm warning about message type.
+ if isinstance(message, bytes):
+ message = message.decode()
+ if expected is not None:
+ message += ' Expected: %s' % expected
+ if given is not None:
+ message += ' Given: %s' % given
+ super(GamePhaseException, self).__init__(message)
+
+class GamePlayerException(ResponseException):
+ """ Invalid player. """
+
+class GameRegistrationPasswordException(ResponseException):
+ """ Invalid game registration password. """
+
+class GameSolitaireException(ResponseException):
+ """ A solitaire game does not accepts players. """
+
+class GameTokenException(ResponseException):
+ """ Invalid token for this game. """
+
+class MapIdException(ResponseException):
+ """ Invalid map ID. """
+
+class MapPowerException(ResponseException):
+ """ Invalid map power. """
+
+ def __init__(self, power_name):
+ super(MapPowerException, self).__init__('Invalid map power %s' % power_name)
+
+class ServerDataDirException(ResponseException):
+ """ No data directory available in server folder. """
+
+class FolderException(ResponseException):
+ """ Given folder not available in server. """
+ def __init__(self, folder_path):
+ super(FolderException, self).__init__('Given folder not available in server: %s' % folder_path)
+
+class ServerGameDirException(ResponseException):
+ """ No games directory available in server/data folder. """
+
+class ServerRegistrationException(ResponseException):
+ """ Registration currently not allowed on this server. """
+
+class TokenException(ResponseException):
+ """ Invalid token. """
+
+class UserException(ResponseException):
+ """ Invalid user. """
+
+class PasswordException(ResponseException):
+ """ Password must not be empty. """
+
+class VoteCreationException(ResponseException):
+ """ Only either a player or a game master for a game with at least 1 player can create a vote. """
+
+class ServerDirException(ResponseException):
+ """ Error with working folder. """
+
+ def __init__(self, server_dir):
+ super(ServerDirException, self).__init__("No server directory available at path %s" % server_dir)