diff --git a/stdplugins/sp_prog_rename.py b/stdplugins/sp_prog_rename.py index 207c903..ee475c2 100644 --- a/stdplugins/sp_prog_rename.py +++ b/stdplugins/sp_prog_rename.py @@ -1,20 +1,30 @@ import asyncio import re import html +from dataclasses import dataclass -from telethon import events +from telethon import events, utils from telethon.tl.functions.channels import EditTitleRequest from telethon.errors.rpcerrorlist import ChatNotModifiedError + MULTI_EDIT_TIMEOUT = 80 REVERT_TIMEOUT = 2 * 60 * 60 -DEFAULT_TITLES = { - 1040270887: 'Programming & Tech', - 1384391544: 'Programming & Tech for girls', - 1286178907: 'test supergroup' -} -rename_lock = asyncio.Lock() -revert_task = None + + +@dataclass +class Group: + id: int + title: str + rename_lock = asyncio.Lock() + revert_task: asyncio.Task = None + + +GROUPS = {group.id: group for group in ( + Group(1040270887, 'Programming & Tech'), + Group(1384391544, 'Programming & Tech for girls'), + Group(1286178907, 'test supergroup') +)} def fix_title(s): @@ -36,35 +46,50 @@ async def edit_title(chat, title): pass # Everything is ok -async def wait_and_revert(chat_id, timeout): +async def wait_and_revert(chat_id, title, timeout): await asyncio.sleep(timeout) - await edit_title(chat_id, DEFAULT_TITLES[chat_id]) + await edit_title(chat_id, title) @borg.on(events.NewMessage( pattern=re.compile(r"(?i)programming (?:&|and) (.+)"), - chats=list(DEFAULT_TITLES.keys()))) + chats=list(GROUPS.keys()))) async def on_name(event): - global revert_task new_topic = fix_title(event.pattern_match.group(1)) new_title = f"Programming & {new_topic}" if "Tech" not in new_title: new_title += " & Tech" - if len(new_title) > 255 or rename_lock.locked(): + group = GROUPS[utils.get_peer_id(event.chat_id, False)] # Thanks Lonami + + logger.info(f'{event.from_id} in {group.id} ' + f'requested a title change to {new_title}') + + if len(new_title) > 255: + logger.info('Not changing group title because new title is too long') return - await event.respond( - f'{html.escape(event.sender.first_name)}' - ' changed the group title!', - parse_mode='html' - ) + if group.rename_lock.locked(): + logger.info('Not changing group title because the rename lock is already held') + return - with (await rename_lock): + with (await group.rename_lock): + logger.info(f'Changing group title to {new_title}') + await event.respond( + f'{html.escape(event.sender.first_name)}' + ' changed the group title!', + parse_mode='html' + ) await edit_title(event.chat_id, new_title) + logger.info(f'Holding rename lock for {MULTI_EDIT_TIMEOUT} seconds') await asyncio.sleep(MULTI_EDIT_TIMEOUT) - if revert_task and not revert_task.done(): - revert_task.cancel() - revert_task = asyncio.create_task( - wait_and_revert(event.chat_id, REVERT_TIMEOUT)) + if group.revert_task and not group.revert_task.done(): + logger.info('Cancelling previous revert task') + group.revert_task.cancel() + logger.info('Creating revert task') + group.revert_task = asyncio.create_task(wait_and_revert( + event.chat_id, + group.title, + REVERT_TIMEOUT + ))