# Pyrogram - Telegram MTProto API Client Library for Python
# Copyright (C) 2017-present Dan <https://github.com/delivrance>
#
# This file is part of Pyrogram.
#
# Pyrogram is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Pyrogram 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 Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
from typing import Optional, Union
from pyrogram import raw
from ..object import Object
[docs]
class Location(Object):
"""A point on the map.
Parameters:
longitude (``float``, *optional*):
Longitude as defined by sender.
latitude (``float``, *optional*):
Latitude as defined by sender.
accuracy_radius (``int``, *optional*):
The estimated horizontal accuracy of the location, in meters as defined by the sender.
address (``str``, *optional*):
Textual description of the address (mandatory).
live_period (``int``, *optional*):
For live locations, the time relative to the message send date, for which the location can be updated, in seconds.
heading (``int``, *optional*):
For live locations, a direction in which the location moves, in degrees; 1-360.
proximity_alert_radius (``int``, *optional*):
For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000).
"""
def __init__(
self,
*,
longitude: Optional[float] = None,
latitude: Optional[float] = None,
accuracy_radius: Optional[int] = None,
address: Optional[str] = None,
live_period: Optional[int] = None,
heading: Optional[int] = None,
proximity_alert_radius: Optional[int] = None
):
super().__init__()
self.longitude = longitude
self.latitude = latitude
self.accuracy_radius = accuracy_radius
self.address = address
self.live_period = live_period
self.heading = heading
self.proximity_alert_radius = proximity_alert_radius
@staticmethod
def _parse(geo_point: "raw.types.GeoPoint") -> Optional["Location"]:
if isinstance(geo_point, raw.types.GeoPoint):
return Location(
longitude=geo_point.long,
latitude=geo_point.lat,
accuracy_radius=geo_point.accuracy_radius,
)
@staticmethod
def _parse_business(location: "raw.types.BusinessLocation") -> "Location":
if isinstance(location, raw.types.BusinessLocation):
longitude = None
latitude = None
accuracy_radius = None
if isinstance(location.geo_point, raw.types.GeoPoint):
longitude = location.geo_point.long
latitude = location.geo_point.lat
accuracy_radius = location.geo_point.accuracy_radius
return Location(
longitude=longitude,
latitude=latitude,
accuracy_radius=accuracy_radius,
address=location.address
)
@staticmethod
def _parse_media(media: "raw.types.MessageMediaGeoLive") -> Optional["Location"]:
if isinstance(media, raw.types.MessageMediaGeoLive):
parsed_location = Location._parse(media.geo)
parsed_location.live_period = media.period
parsed_location.heading = media.heading
parsed_location.proximity_alert_radius = media.proximity_notification_radius
return parsed_location
async def write(self, **kwargs) -> Union["raw.types.InputMediaGeoPoint", "raw.types.InputMediaGeoLive"]:
if self.live_period is not None:
return raw.types.InputMediaGeoLive(
geo_point=raw.types.InputGeoPoint(
lat=self.latitude or 0,
long=self.longitude or 0,
accuracy_radius=self.accuracy_radius,
),
heading=self.heading,
period=self.live_period,
proximity_notification_radius=self.proximity_alert_radius,
)
return raw.types.InputMediaGeoPoint(
geo_point=raw.types.InputGeoPoint(
lat=self.latitude or 0,
long=self.longitude or 0,
accuracy_radius=self.accuracy_radius,
),
)