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.utils import configGet, locale, should_quote, find_location from modules.database import col_applications from classes.errors.geo import PlaceNotFoundError # Nearby command =============================================================================================================== @app.on_message(~ filters.scheduled & (custom_filters.allowed | custom_filters.admin) & (filters.private | (filters.chat(configGet("admin_group")) | filters.chat(configGet("destination_group")))) & filters.command(["nearby"], prefixes=["/"])) async def cmd_nearby(app: Client, msg: Message): holo_user = HoloUser(msg.from_user) # Check if any place provided if len(msg.command) < 2: # Action if no place provided application = col_applications.find_one({"user": msg.from_user}) if application is None: await msg.reply_text(locale("nearby_user_empty", "message", locale=holo_user)) return location = application["application"]["3"]["loc"][0], application["application"]["3"]["loc"][1] else: # Find a place from input query try: location_coordinates = find_location(" ".join(msg.command[2:])) location = location_coordinates["lng"], 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 = [] users_nearby = col_applications.find( {"application.loc": {"$near": { "$geometry": { "type": "Point", "coordinates": location }, "$maxDistance": 30000 }} } ) for user in users_nearby: if user["tg_username"] not in [None, "None", ""]: # Check if user has any name output.append(f'• {user["tg_name"]} (@{user["tg_username"]}):\n {user["application"]["3"]["Name"]}, {user["application"]["3"]["adminName1"]}') else: output.append(f'• {user["tg_name"]}:\n {user["application"]["3"]["Name"]}, {user["application"]["3"]["adminName1"]}') # 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)) # if not path.exists(f"{configGet('data', 'locations')}{sep}sponsors{sep}{msg.from_user.id}.json"): # jsonSave(jsonLoad(f"{configGet('data', 'locations')}{sep}sponsor_default.json"), f"{configGet('data', 'locations')}{sep}sponsors{sep}{msg.from_user.id}.json") # sponsor = jsonLoad(f"{configGet('data', 'locations')}{sep}sponsors{sep}{msg.from_user.id}.json") # if sponsor["approved"]: # if sponsor["expires"] is not None: # if datetime.strptime(sponsor["expires"], "%d.%m.%Y") > datetime.now(): # await msg.reply_text(f"You have an active sub til **{sponsor['expires']}**.") # else: # await msg.reply_text(f"Your sub expired {int((datetime.now()-datetime.strptime(sponsor['expires'], '%d.%m.%Y')).days)} days ago.") # elif sponsor["approved"]: # await msg.reply_text(f"Your sub expiration date is not valid.") # else: # await msg.reply_text(f"You have no active subscription.") # ==============================================================================================================================