44 lines
1.3 KiB
Python
44 lines
1.3 KiB
Python
from dataclasses import dataclass, field
|
|
from typing import Collection, Union
|
|
from uuid import UUID
|
|
|
|
RawServiceClass = Union[UUID, int]
|
|
"""
|
|
Raw type for service classes received by pybluez.
|
|
Can be either a 16-bit integer or a UUID.
|
|
"""
|
|
|
|
|
|
@dataclass
|
|
class DevicesBlacklist:
|
|
"""
|
|
A data class representing the rules for blacklisting devices.
|
|
"""
|
|
|
|
addresses: Collection[str] = field(default_factory=set[str])
|
|
""" MAC addresses to ignore. """
|
|
names: Collection[str] = field(default_factory=set[str])
|
|
""" Device names to ignore. """
|
|
manufacturers: Collection[str] = field(default_factory=set[str])
|
|
""" Manufacturers strings to ignore. """
|
|
|
|
def __post_init__(self):
|
|
"""
|
|
Normalize the blacklist rules.
|
|
"""
|
|
# Normalize case-sensitivity for addresses
|
|
self.addresses = set(map(str.lower, self.addresses))
|
|
# Make sure that all the collections are sets
|
|
self.names = set(self.names)
|
|
self.manufacturers = set(self.manufacturers)
|
|
|
|
def matches(self, device) -> bool:
|
|
"""
|
|
:type device: :class:`platypush.entities.bluetooth.BluetoothDevice`.
|
|
"""
|
|
return (
|
|
device.address.lower() in self.addresses
|
|
or device.name in self.names
|
|
or device.manufacturer in self.manufacturers
|
|
)
|