Files
limoka/vsecoder/hikka_modules/accounttime.py
2025-07-10 21:02:34 +03:00

186 lines
5.3 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
_
__ _____ ___ ___ ___ __| | ___ _ __
\ \ / / __|/ _ \/ __/ _ \ / _` |/ _ \ '__|
\ V /\__ \ __/ (_| (_) | (_| | __/ |
\_/ |___/\___|\___\___/ \__,_|\___|_|
Copyleft 2022 t.me/vsecoder
This program is free software; you can redistribute it and/or modify
"""
# meta developer: @vsecoder_m
# meta pic: https://img.icons8.com/fluency/344/timer.png
# meta banner: https://chojuu.vercel.app/api/banner?img=https://img.icons8.com/fluency/344/timer.png&title=Account%20Time&description=Get%20the%20account%20registration%20date%20and%20time!
__version__ = (2, 5, 0)
import logging
import asyncio
from typing import Callable, Tuple
import time
from dateutil.relativedelta import relativedelta
import numpy as np
from datetime import datetime
from .. import loader, utils # type: ignore
data = {
"1000000": 1380326400,
"2768409": 1383264000,
"7679610": 1388448000,
"11538514": 1391212000,
"15835244": 1392940000,
"23646077": 1393459000,
"38015510": 1393632000,
"44634663": 1399334000,
"46145305": 1400198000,
"54845238": 1411257000,
"63263518": 1414454000,
"101260938": 1425600000,
"101323197": 1426204000,
"111220210": 1429574000,
"103258382": 1432771000,
"103151531": 1433376000,
"116812045": 1437696000,
"122600695": 1437782000,
"109393468": 1439078000,
"112594714": 1439683000,
"124872445": 1439856000,
"130029930": 1441324000,
"125828524": 1444003000,
"133909606": 1444176000,
"157242073": 1446768000,
"143445125": 1448928000,
"148670295": 1452211000,
"152079341": 1453420000,
"171295414": 1457481000,
"181783990": 1460246000,
"222021233": 1465344000,
"225034354": 1466208000,
"278941742": 1473465000,
"285253072": 1476835000,
"294851037": 1479600000,
"297621225": 1481846000,
"328594461": 1482969000,
"337808429": 1487707000,
"341546272": 1487782000,
"352940995": 1487894000,
"369669043": 1490918000,
"400169472": 1501459000,
"616816630": 1529625600,
"727572658": 1543708800,
"782000000": 1546300800,
"925078064": 1563290000,
"1974255900": 1634000000,
"3318845111": 1618028800,
"4317845111": 1620028800,
"5336336790": 1646368100,
"5396587273": 1648014800,
"6020888206": 1675534800,
"6057123350": 1676198350,
"6554264430": 1695654800,
}
class Function:
def __init__(self, order: int = 3):
self.order = 3
self.x, self.y = self._unpack_data()
self._func = self._fit_data()
def _unpack_data(self) -> Tuple[list, list]:
x_data = np.array(list(map(int, data.keys())))
y_data = np.array(list(data.values()))
return (x_data, y_data)
def _fit_data(self) -> Callable[[int], int]:
fitted = np.polyfit(self.x, self.y, self.order)
return np.poly1d(fitted)
def add_datapoint(self, pair: tuple):
pair[0] = str(pair[0])
data.update([pair])
# update the model with new data
# self.x, self.y = self._unpack_data()
self._func = self._fit_data()
def func(self, tg_id: int) -> int:
value = self._func(tg_id)
current = time.time()
if value > current:
value = current
return value
logger = logging.getLogger(__name__)
@loader.tds
class AcTimeMod(loader.Module):
"""Module for get account time"""
strings = {
"name": "Account Time",
"info": "Get the account registration date and time!",
"error": "Error!",
"answer": (
"⏳ This account: {0}\n🕰 A registered: {1}\n\nP.S. The module script is"
" trained with the number of requests from different ids, so the data can"
" be refined"
),
}
strings_ru = {
"info": "Узнай дату регистрации аккаунта, и время, которое вы его используете!",
"error": "Ошибка!",
}
def __init__(self):
self.name = self.strings["name"]
async def client_ready(self, client, db):
self.client = client
self.db = db
def time_format(self, unix_time: int, fmt="%Y-%m-%d") -> list:
result = [str(datetime.utcfromtimestamp(unix_time).strftime(fmt))]
d = relativedelta(datetime.now(), datetime.utcfromtimestamp(unix_time))
result.append(f"{d.years} years, {d.months} months, {d.days} days")
return result
@loader.unrestricted
@loader.ratelimit
async def actimecmd(self, message):
"""
- get the account registration date and time [beta]
P.S. You can also send a command in response to a message
"""
try:
interpolation = Function()
reply = await message.get_reply_message()
if reply:
date = self.time_format(
unix_time=round(interpolation.func(int(reply.sender.id)))
)
else:
date = self.time_format(
unix_time=round(interpolation.func(int(message.from_id)))
)
await utils.answer(message, self.strings["answer"].format(date[0], date[1]))
except Exception as e:
await utils.answer(message, f'{self.strings["error"]}\n\n{e}')
if message.out:
await asyncio.sleep(5)
await message.delete()