forked from uniborg/uniborg
fix
This commit is contained in:
parent
3b71397a37
commit
0948bd1d5b
|
@ -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
|
||||||
|
))
|
||||||
|
|
Loading…
Reference in New Issue