Compare commits

..

9 Commits

Author SHA1 Message Date
udf fc78927fa6
Merge branch 'kate' of github.com:udf/uniborg into kate 2019-04-29 20:09:09 +02:00
udf 9f61d75ec9
fix 2019-04-29 20:04:21 +02:00
udf 5fa301f563
remove me up inside 2019-04-29 20:01:59 +02:00
udf 0948bd1d5b fix 2019-04-27 13:51:54 +00:00
udf 3b71397a37
remove unused function 2019-04-27 12:22:42 +02:00
udf ccd47186b1
make it work for different chats 2019-04-27 12:22:23 +02:00
udf d2c6607429
echo user who changed the group title 2019-04-27 12:15:40 +02:00
udf 0b64a64568
remove waiting for deletion 2019-04-27 12:05:46 +02:00
udf b98bc8eb02
remove useless caching 2019-04-27 12:01:40 +02:00
2 changed files with 55 additions and 39 deletions

View File

@ -1,17 +1,30 @@
import asyncio import asyncio
import re 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.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
CHANNEL_ID = 1040270887
DEFAULT_TITLE = "Programming & Tech"
prog_tech_channel = None @dataclass
rename_lock = asyncio.Lock() class Group:
revert_task = None 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): def fix_title(s):
@ -24,56 +37,59 @@ def fix_title(s):
return re.sub(r'(\S+)(\s+)?', replace, s) return re.sub(r'(\S+)(\s+)?', replace, s)
async def edit_title(title): async def edit_title(chat, title):
global prog_tech_channel
if prog_tech_channel is None:
prog_tech_channel = await borg.get_entity(CHANNEL_ID)
try: try:
await borg(EditTitleRequest( await borg(EditTitleRequest(
channel=prog_tech_channel, title=title channel=chat, title=title
)) ))
except ChatNotModifiedError: except ChatNotModifiedError:
pass # Everything is ok pass # Everything is ok
async def wait_for_delete(deleted_fut, timeout): async def wait_and_revert(chat_id, title, timeout):
try: await asyncio.sleep(timeout)
await asyncio.wait_for(deleted_fut, timeout) await edit_title(chat_id, title)
return True
except asyncio.TimeoutError:
pass
return False
async def wait_and_revert(deleted_fut, timeout):
await wait_for_delete(deleted_fut, timeout)
await edit_title(DEFAULT_TITLE)
@borg.on(events.NewMessage( @borg.on(events.NewMessage(
pattern=re.compile(r"(?i)programming (?:&|and) (.+)"), chats=CHANNEL_ID)) pattern=re.compile(r"(?i)programming (?:&|and) (.+)"),
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
with (await rename_lock): if group.rename_lock.locked():
await edit_title(new_title) logger.info('Not changing group title because the rename lock is already held')
deleted_fut = borg.await_event(events.MessageDeleted( return
chats=CHANNEL_ID,
func=lambda e: e.deleted_id == event.message.id
))
if await wait_for_delete(asyncio.shield(deleted_fut), MULTI_EDIT_TIMEOUT):
await edit_title(DEFAULT_TITLE)
await asyncio.sleep(MULTI_EDIT_TIMEOUT)
return
if revert_task and not revert_task.done(): with (await group.rename_lock):
revert_task.cancel() 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)
logger.info(f'Holding rename lock for {MULTI_EDIT_TIMEOUT} seconds')
await asyncio.sleep(MULTI_EDIT_TIMEOUT)
revert_task = asyncio.create_task(wait_and_revert(deleted_fut, 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
))