udf 2019-04-27 13:51:54 +00:00
parent 3b71397a37
commit 0948bd1d5b
1 changed files with 48 additions and 23 deletions

View File

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