mautrix-instagram/mauigpapi/state/device.py

77 lines
2.8 KiB
Python

# mautrix-instagram - A Matrix-Instagram puppeting bridge.
# Copyright (C) 2023 Tulir Asokan
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from typing import Optional, Union
from uuid import UUID
import random
import string
import time
from attr import dataclass
import attr
from mautrix.types import SerializableAttrs
@dataclass
class AndroidDevice(SerializableAttrs):
id: Optional[str] = None
descriptor: Optional[str] = None
uuid: Optional[str] = None
fdid: Optional[str] = None
phone_id: Optional[str] = attr.ib(default=None, metadata={"json": "phoneId"})
# Google Play advertising ID
adid: Optional[str] = None
language: str = "en_US"
radio_type: str = "wifi-none"
connection_type: str = "WIFI"
timezone_offset: str = str(-time.timezone)
is_layout_rtl: bool = False
@property
def battery_level(self) -> int:
rand = random.Random(self.id)
percent_time = rand.randint(200, 600)
return 100 - round(time.time() / percent_time) % 100
@property
def is_charging(self) -> bool:
rand = random.Random(f"{self.id}{round(time.time() / 10800)}")
return rand.choice([True, False])
@property
def payload(self) -> dict:
device_parts = self.descriptor.split(";")
android_version, android_release, *_ = device_parts[0].split("/")
manufacturer, *_ = device_parts[3].split("/")
model = device_parts[4]
return {
"android_version": android_version,
"android_release": android_release,
"manufacturer": manufacturer,
"model": model,
}
def generate(self, seed: Union[str, bytes]) -> None:
rand = random.Random(seed)
self.phone_id = str(UUID(int=rand.getrandbits(128), version=4))
self.adid = str(UUID(int=rand.getrandbits(128), version=4))
self.id = f"android-{''.join(rand.choices(string.hexdigits, k=16))}".lower()
self.descriptor = "33/13; 420dpi; 1080x2219; Google/google; Pixel 6; oriole; oriole"
# "33/13; 560dpi; 1440x2934; Google/google; Pixel 6 Pro; raven; raven",
self.uuid = str(UUID(int=rand.getrandbits(128), version=4))
self.fdid = str(UUID(int=rand.getrandbits(128), version=4))