118 lines
4.3 KiB
Python
118 lines
4.3 KiB
Python
from os import path
|
|
from traceback import print_exc
|
|
from app import app
|
|
from pyrogram import filters
|
|
from pyrogram.types import Message
|
|
from pyrogram.client import Client
|
|
from classes.holo_user import HoloUser
|
|
from modules import custom_filters
|
|
from modules.logging import logWrite
|
|
from modules.utils import configGet, jsonLoad, locale, should_quote, find_location
|
|
from modules.database import col_applications, col_users
|
|
from classes.errors.geo import PlaceNotFoundError
|
|
|
|
|
|
@app.on_message(
|
|
custom_filters.enabled_applications
|
|
& ~filters.scheduled
|
|
& (
|
|
filters.private
|
|
| (
|
|
filters.chat(configGet("admin", "groups"))
|
|
| filters.chat(configGet("users", "groups"))
|
|
)
|
|
)
|
|
& filters.command(["nearby"], prefixes=["/"])
|
|
& (custom_filters.allowed | custom_filters.admin)
|
|
& ~custom_filters.banned
|
|
)
|
|
async def cmd_nearby(app: Client, msg: Message):
|
|
holo_user = HoloUser(msg.from_user)
|
|
|
|
# Check if any place provided
|
|
if len(msg.command) == 1: # Action if no place provided
|
|
application = col_applications.find_one({"user": msg.from_user.id})
|
|
if application is None:
|
|
await msg.reply_text(
|
|
locale("nearby_user_empty", "message", locale=holo_user)
|
|
)
|
|
return
|
|
location = (
|
|
application["application"]["3"]["location"][0],
|
|
application["application"]["3"]["location"][1],
|
|
)
|
|
else: # Find a place from input query
|
|
logWrite(f"Looking for the location by query '{' '.join(msg.command[1:])}'")
|
|
try:
|
|
location_coordinates = find_location(" ".join(msg.command[1:]))
|
|
location = float(location_coordinates["lng"]), float(
|
|
location_coordinates["lat"]
|
|
)
|
|
except PlaceNotFoundError: # Place is not found
|
|
await msg.reply_text(
|
|
locale("nearby_invalid", "message", locale=holo_user),
|
|
quote=should_quote(msg),
|
|
)
|
|
return
|
|
except Exception as exp: # Error occurred while finding the place
|
|
await msg.reply_text(
|
|
locale("nearby_error", "message", locale=holo_user).format(
|
|
exp, print_exc()
|
|
),
|
|
quote=should_quote(msg),
|
|
)
|
|
return
|
|
|
|
# Find all users registered in the area provided
|
|
output = []
|
|
applications_nearby = col_applications.find(
|
|
{
|
|
"application.3.location": {
|
|
"$nearSphere": {
|
|
"$geometry": {
|
|
"type": "Point",
|
|
"coordinates": [location[0], location[1]],
|
|
},
|
|
"$maxDistance": configGet("search_radius") * 1000,
|
|
}
|
|
}
|
|
}
|
|
)
|
|
|
|
for entry in applications_nearby:
|
|
if not entry["user"] == msg.from_user.id:
|
|
user = col_users.find_one({"user": entry["user"]})
|
|
if user is not None:
|
|
if entry["user"] in jsonLoad(
|
|
path.join(configGet("cache", "locations"), "group_members")
|
|
):
|
|
if user["tg_username"] not in [
|
|
None,
|
|
"None",
|
|
"",
|
|
]: # Check if user has any name
|
|
output.append(
|
|
f'• **{user["tg_name"]}** (@{user["tg_username"]}):\n - {entry["application"]["3"]["name"]}, {entry["application"]["3"]["adminName1"]}'
|
|
)
|
|
else:
|
|
output.append(
|
|
f'• **{user["tg_name"]}**:\n - {entry["application"]["3"]["name"]}, {entry["application"]["3"]["adminName1"]}'
|
|
)
|
|
|
|
logWrite(
|
|
f"{holo_user.id} tried to find someone nearby {location[1]} {location[0]} in the radius of {configGet('search_radius')} kilometers"
|
|
)
|
|
|
|
# Check if any users found
|
|
if len(output) > 0:
|
|
await msg.reply_text(
|
|
locale("nearby_result", "message", locale=holo_user).format(
|
|
"\n".join(output)
|
|
),
|
|
quote=should_quote(msg),
|
|
)
|
|
else:
|
|
await msg.reply_text(
|
|
locale("nearby_empty", "message", locale=holo_user), quote=should_quote(msg)
|
|
)
|