diff --git a/.env.dist b/.env.dist index 1a835ae..787f75f 100644 --- a/.env.dist +++ b/.env.dist @@ -1,12 +1,14 @@ bot_token = "" -limit_of_warns = 5 - api_id = "" api_hash = "" group_id = "" second_group_id = "" -db_url = "sqlite://db.db" telegram_api_server = "127.0.0.1:5326" +db_url = "sqlite://db.db" + +limit_of_warns = 5 + +update_interval = 3600 diff --git a/app.py b/app.py index ef5c2ca..66e6fe4 100755 --- a/app.py +++ b/app.py @@ -3,7 +3,8 @@ import logging from aiogram import executor from database import db, Member, Restriction -from load import dp, bot +from load import dp, bot, scheduler + import filters dp.filters_factory.bind(filters.AvaibleRolesFilter) @@ -39,9 +40,14 @@ async def on_startup(dp): from utils.default_commands import set_default_commands await set_default_commands(dp) + # Reloading users data + from utils import reload_users_data + scheduler.add_job(reload_users_data,"interval", seconds=config.update_interval) + scheduler.start() + from load import tgc await tgc.client.start() - + await bot.set_webhook(WEBHOOK_URL) async def on_shutdown(dp): @@ -61,11 +67,11 @@ def main() -> None: on_shutdown=on_shutdown, skip_updates=True, host=WEBAPP_HOST, - port=WEBAPP_PORT, + port=WEBAPP_PORT ) else: executor.start_polling(dp,skip_updates=True) - + if __name__ == '__main__': main() diff --git a/config/config.py b/config/config.py index d5a5424..f6b492e 100644 --- a/config/config.py +++ b/config/config.py @@ -18,6 +18,9 @@ limit_of_warns = 5 api_id = env.int("api_id") api_hash = env.str("api_hash") +# Data update interval +update_interval = env.int("update_interval") + group_permissions = { "can_send_messages":True, "can_send_media_messages":False, diff --git a/handlers/groups/simple_admin.py b/handlers/groups/simple_admin.py index 09ee504..0bbec9d 100644 --- a/handlers/groups/simple_admin.py +++ b/handlers/groups/simple_admin.py @@ -124,8 +124,6 @@ async def kick_user(message: types.Message): if (not status1 and status2) and (not command.is_silent): await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has kicked [{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown") - - Restriction.create( from_user=from_user, to_user=to_user, @@ -167,7 +165,6 @@ async def mute_user(message:types.Message): if status and (not command.is_silent): await message.answer(f"[{from_user.first_name}](tg://user?id={from_user.user_id}) has muted [{to_user.first_name}](tg://user?id={to_user.user_id})",parse_mode="Markdown") - Restriction.create( from_user=from_user, to_user=to_user, @@ -290,7 +287,6 @@ async def warn_user(message: types.Message): await message.answer(f"[{to_user.first_name}](tg://user?id={to_user.user_id}) has been banned!",parse_mode="Markdown") await bot.kick_chat_member(chat_id=message.chat.id, user_id=to_user.user_id, until_date=None) - Restriction.create( from_user=from_user, to_user=to_user, @@ -304,44 +300,11 @@ async def warn_user(message: types.Message): commands_prefix="!" ) async def reload(message: types.Message): - from load import tgc + from utils import reload_users_data + await reload_users_data() - owner_exists = Member.get_or_none(Member.role == "owner") - if (not owner_exists): - Member.create( - user_id = message.from_user.id, - first_name = message.from_user.first_name, - username = message.from_user.username, - role = "owner", - ) - - # TODO: do this every 1 hours - members = await tgc.members_list(config.group_id) - - for member in members: - user = Member.get_or_none(Member.user_id == member["id"]) - - if (not user): - Member.create( - user_id = member["id"], - first_name = member["first_name"], - username = member["username"], - ) - else: - user.first_name = member["first_name"] - user.username = member["username"] - user.save() - - - group = await bot.get_chat(message.chat.id) - group_permissions = dict(group["permissions"]) - - for permission in group_permissions.keys(): - config.group_permissions[permission] = group_permissions[permission] - await message.answer("Reloaded!") - @dp.message_handler( commands=["setrole"], commands_prefix="!", diff --git a/load.py b/load.py index 2aecea2..fdc7572 100644 --- a/load.py +++ b/load.py @@ -2,15 +2,19 @@ from aiogram import Bot, Dispatcher from aiogram import types from aiogram.bot.api import TelegramAPIServer from aiogram.contrib.fsm_storage.memory import MemoryStorage +from apscheduler.schedulers.asyncio import AsyncIOScheduler import config import utils + storage = MemoryStorage() # Create client connection tgc = utils.TelegramClient(config.api_id, config.api_hash, config.token) +scheduler = AsyncIOScheduler() + bot = Bot( token=config.token, server=TelegramAPIServer.from_base(config.telegram_api_server), diff --git a/requirements.txt b/requirements.txt index 31f78d9..c8fe775 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ -aiogram==2.23.1 +aiogram==2.24 Pyrogram==2.0.62 peewee==3.15.4 environs==9.5.0 TgCrypto==1.2.5 +APScheduler==3.9.1.post1 diff --git a/utils/__init__.py b/utils/__init__.py index 55ac814..8225350 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -2,6 +2,7 @@ from .notify_start import notify_started_bot from .default_commands import set_default_commands from .telegram_client import TelegramClient +from .reload_users import reload_users_data from .parse_timedelta import parse_timedelta from .command_parser import get_argument, get_command_args diff --git a/utils/reload_users.py b/utils/reload_users.py new file mode 100644 index 0000000..8940083 --- /dev/null +++ b/utils/reload_users.py @@ -0,0 +1,31 @@ +async def reload_users_data(): + import config + from database import Member + from load import tgc, bot + + members = await tgc.members_list(config.group_id) + + for member in members: + user = Member.get_or_none(Member.user_id == member["id"]) + + first_name = member["first_name"] + if (not first_name): + first_name = "NULL" + + if (not user): + Member.create( + user_id = member["id"], + first_name = first_name, + username = member["username"], + ) + else: + user.first_name = first_name + user.username = member["username"] + user.save() + + + group = await bot.get_chat(config.group_id) + group_permissions = dict(group["permissions"]) + + for permission in group_permissions.keys(): + config.group_permissions[permission] = group_permissions[permission]