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))