File indexing completed on 2024-04-28 07:51:09
0001 # -*- coding: utf-8 -*- 0002 0003 """ 0004 Copyright (C) 2009-2016 Wolfgang Rohdewald <wolfgang@rohdewald.de> 0005 0006 SPDX-License-Identifier: GPL-2.0 0007 0008 """ 0009 0010 import weakref 0011 0012 from common import Debug, StrMixin, Internal 0013 from message import Message 0014 from wind import Wind 0015 from tile import Tile, TileList 0016 from meld import Meld, MeldList 0017 0018 0019 class Move(StrMixin): 0020 0021 """used for decoded move information from the game server""" 0022 0023 def __init__(self, player, command, kwargs): 0024 if isinstance(command, Message): 0025 self.message = command 0026 else: 0027 self.message = Message.defined[command] 0028 self.table = None 0029 self.notifying = False 0030 self._player = weakref.ref(player) if player else None 0031 self.token = kwargs['token'] 0032 self.kwargs = kwargs.copy() 0033 del self.kwargs['token'] 0034 self.score = None 0035 self.lastMeld = None 0036 for key, value in kwargs.items(): 0037 assert not isinstance(value, bytes), 'value is bytes:{}'.format(repr(value)) 0038 if value is None: 0039 self.__setattr__(key, None) 0040 else: 0041 if key.lower().endswith('tile'): 0042 self.__setattr__(key, Tile(value)) 0043 elif key.lower().endswith('tiles'): 0044 self.__setattr__(key, TileList(value)) 0045 elif key.lower().endswith('meld'): 0046 self.__setattr__(key, Meld(value)) 0047 elif key.lower().endswith('melds'): 0048 self.__setattr__(key, MeldList(value)) 0049 elif key == 'playerNames': 0050 if Internal.isServer: 0051 self.__setattr__(key, value) 0052 else: 0053 self.__setattr__(key, self.__convertWinds(value)) 0054 else: 0055 self.__setattr__(key, value) 0056 0057 @staticmethod 0058 def __convertWinds(tuples): 0059 """convert wind strings to Wind objects""" 0060 result = list() 0061 for wind, name in tuples: 0062 result.append(tuple([Wind(wind), name])) 0063 return result 0064 0065 @property 0066 def player(self): 0067 """hide weakref""" 0068 return self._player() if self._player else None 0069 0070 @staticmethod 0071 def prettyKwargs(kwargs): 0072 """this is also used by the server, but the server does not use class Move""" 0073 result = '' 0074 for key in sorted(kwargs.keys()): 0075 value = kwargs[key] 0076 if key == 'token': 0077 continue 0078 if isinstance(value, (list, tuple)) and isinstance(value[0], (list, tuple)): 0079 oldValue = value 0080 tuples = [] 0081 for oldTuple in oldValue: 0082 tuples.append(''.join(str(x) for x in oldTuple)) 0083 value = ','.join(tuples) 0084 if Debug.neutral and key == 'gameid': 0085 result += ' gameid:GAMEID' 0086 elif isinstance(value, bool) and value: 0087 result += ' %s' % key 0088 elif isinstance(value, bool): 0089 pass 0090 elif isinstance(value, bytes): 0091 result += ' %s:%s' % (key, value.decode()) 0092 else: 0093 result += ' %s:%s' % (key, value) 0094 for old, new in (("('", "("), ("')", ")"), (" '", ""), 0095 ("',", ","), ("[(", "("), ("])", ")")): 0096 result = result.replace(old, new) 0097 return result 0098 0099 def __str__(self): 0100 return '%s %s%s' % (self.player, self.message, Move.prettyKwargs(self.kwargs))