mirror of
https://github.com/MuRuLOSE/limoka.git
synced 2026-06-16 14:34:17 +02:00
186 lines
5.3 KiB
Python
186 lines
5.3 KiB
Python
"""
|
||
_
|
||
__ _____ ___ ___ ___ __| | ___ _ __
|
||
\ \ / / __|/ _ \/ __/ _ \ / _` |/ _ \ '__|
|
||
\ 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()
|