Source code for filters.recipients
# ../filters/recipients.py
"""Provides Recipient Filtering functionality."""
# ============================================================================
# >> IMPORTS
# ============================================================================
# Source.Python Imports
# Filters
from _filters._recipients import _RecipientFilter
from _filters._recipients import BaseRecipientFilter
# Players
from players.entity import Player
# =============================================================================
# >> ALL DECLARATION
# =============================================================================
__all__ = ('RecipientFilter',
'BaseRecipientFilter',
)
# ============================================================================
# >> CLASSES
# ============================================================================
[docs]class RecipientFilter(_RecipientFilter):
"""Class used to improve the ease of use of a _RecipientFilter instance."""
[docs] def __init__(self, *filters):
"""Initialize and update the recipient filter."""
# Initialize the _RecipientFilter
super().__init__()
# Store the given filters
self.filters = filters
# Update the recipient matching the given filters
self.update(*self.filters)
def __getitem__(self, item):
"""Return the index at the given recipient slot."""
# Slicing?
if isinstance(item, slice):
# Return a mapping matching the given slice
return list(map(
self.get_recipient_index, range(*item.indices(len(self)))))
# Return the index at the given recipient slot
return self.get_recipient_index[item]
def __iter__(self):
"""Iterate over the recipient filter."""
# Loop through each index in the filter
for index in range(len(self)):
# Yield the recipient
yield self.get_recipient_index(index)
def __repr__(self):
"""Return a readable representation of the recipient filter."""
return '({0})'.format(', '.join(map(str, self)))
[docs] def merge(self, iterable):
"""Merge the given recipient."""
# Loop through all indexes of the given recipient
for index in iterable:
# Get the index if a Player object was passed
# This is also a fix for PlayerIter now
# only iterating over Player instances.
if isinstance(index, Player):
index = index.index
# Add the current index to the recipient filter
self.add_recipient(index)
[docs] def update(self, *args, clear=True):
"""Update the recipient filter matching the given filters."""
# Clear the recipient first?
if clear:
# Remove all players from the recipient filter
self.remove_all_players()
# No given filters?
if not args:
# Use the filters we got on initialization
args = self.filters
# Still no filters?
if not args:
# Add all players to the recipient
self.add_all_players()
# Otherwise
else:
# Loop through all filters
for filter_ in args:
# Is the current filter an index?
if isinstance(filter_, int):
# Add the current filter as an index
self.add_recipient(filter_)
# Otherwise, is the current filter a Player instance?
elif isinstance(filter_, Player):
# Add the player to the recipient filter...
self.add_recipient(filter_.index)
# Otherwise
else:
# Assume it is an iterable and merge it to the recipient
# filter
self.merge(filter_)