2525
2626
2727from .players import ClanMember
28- from .miscmodels import try_enum , ChatLanguage , Location , Label , WarLeague
28+ from .miscmodels import try_enum , ChatLanguage , Location , Label , WarLeague , CapitalDistrict
2929from .utils import get , cached_property , correct_tag
3030from .abc import BaseClan
3131
@@ -129,6 +129,9 @@ class Clan(BaseClan):
129129 member_cls: :class:`coc.ClanMember`
130130 The type which the members found in :attr:`Clan.members` will be of.
131131 Ensure any overriding of this inherits from :class:`coc.ClanMember`.
132+ capital_district_cls: :class:`coc.CapitalDistrict`
133+ The type which the clan capital districts found in :attr:`Clan.capital_districts` will be of.
134+ Ensure any overriding of this inherits from :class:`coc.CapitalDistrict`.
132135 war_league: :class:`coc.WarLeague`
133136 The clan's CWL league.
134137 """
@@ -149,24 +152,28 @@ class Clan(BaseClan):
149152 "member_count" ,
150153 "_labels" ,
151154 "_members" ,
155+ "_districts" ,
152156 "_client" ,
153157 "label_cls" ,
154158 "member_cls" ,
159+ "capital_district_cls" ,
155160 "war_league" ,
156161 "chat_language" ,
157162
158163 "_cs_labels" ,
159164 "_cs_members" ,
165+ "_cs_members_dict" ,
166+ "_cs_capital_districts" ,
160167 "_iter_labels" ,
161168 "_iter_members" ,
169+ "_iter_capital_districts"
162170 )
163171
164172 def __init__ (self , * , data , client , ** _ ):
165173 super ().__init__ (data = data , client = client )
166174 self .label_cls = Label
167175 self .member_cls = ClanMember
168-
169- self ._members = None # type: typing.Optional[typing.Dict[str, ClanMember]]
176+ self .capital_district_cls = CapitalDistrict
170177
171178 self ._from_data (data )
172179
@@ -200,6 +207,13 @@ def _from_data(self, data: dict) -> None:
200207 member_cls (data = mdata , client = self ._client , clan = self ) for mdata in data_get ("memberList" , [])
201208 )
202209
210+ capital_district_cls = self .capital_district_cls
211+ if data_get ("clanCapital" ):
212+ self ._iter_capital_districts = (capital_district_cls (data = cddata , client = self ._client ) for cddata in
213+ data_get ("clanCapital" )["districts" ])
214+ else :
215+ self ._iter_capital_districts = ()
216+
203217 @cached_property ("_cs_labels" )
204218 def labels (self ) -> typing .List [Label ]:
205219 """List[:class:`Label`]: A :class:`List` of :class:`Label` that the clan has."""
@@ -208,8 +222,18 @@ def labels(self) -> typing.List[Label]:
208222 @cached_property ("_cs_members" )
209223 def members (self ) -> typing .List [ClanMember ]:
210224 """List[:class:`ClanMember`]: A list of members that belong to the clan."""
211- dict_members = self ._members = {m .tag : m for m in self ._iter_members }
212- return list (dict_members .values ())
225+ return list (self .members_dict .values ())
226+
227+ @cached_property ("_cs_members_dict" )
228+ def members_dict (self ) -> typing .Dict [str , ClanMember ]:
229+ """Dict[str, :class:`ClanMember`]: A dict of members that belong to the clan."""
230+ return {m .tag : m for m in self ._iter_members }
231+
232+
233+ @cached_property ("_cs_capital_districts" )
234+ def capital_districts (self ) -> typing .List [CapitalDistrict ]:
235+ """List[:class:`CapitalDistrict`]: A :class:`List` of :class:`CapitalDistrict` that the clan has."""
236+ return list (self ._iter_capital_districts )
213237
214238 def get_member (self , tag : str ) -> typing .Optional [ClanMember ]:
215239 """Return a :class:`ClanMember` with the tag provided. Returns ``None`` if not found.
@@ -226,11 +250,11 @@ def get_member(self, tag: str) -> typing.Optional[ClanMember]:
226250 The member who matches the tag provided: Optional[:class:`ClanMember`]
227251 """
228252 tag = correct_tag (tag )
229- if not self ._members :
253+ if not self .members_dict :
230254 _ = self .members
231255
232256 try :
233- return self ._members [tag ]
257+ return self .members_dict [tag ]
234258 except KeyError :
235259 return None
236260
0 commit comments