2018-06-03 12:16:14 +00:00
|
|
|
import asyncio
|
2018-11-01 21:02:34 +00:00
|
|
|
import re
|
2019-04-27 10:15:40 +00:00
|
|
|
import html
|
2018-11-01 21:02:34 +00:00
|
|
|
|
2018-06-03 12:16:14 +00:00
|
|
|
from telethon import events
|
|
|
|
from telethon.tl.functions.channels import EditTitleRequest
|
2018-11-22 14:02:48 +00:00
|
|
|
from telethon.errors.rpcerrorlist import ChatNotModifiedError
|
2018-06-03 12:16:14 +00:00
|
|
|
|
2019-04-02 20:46:36 +00:00
|
|
|
MULTI_EDIT_TIMEOUT = 80
|
|
|
|
REVERT_TIMEOUT = 2 * 60 * 60
|
2019-04-27 10:22:23 +00:00
|
|
|
DEFAULT_TITLES = {
|
|
|
|
1040270887: 'Programming & Tech',
|
|
|
|
1384391544: 'Programming & Tech for girls',
|
|
|
|
1286178907: 'test supergroup'
|
|
|
|
}
|
2019-04-02 20:21:26 +00:00
|
|
|
rename_lock = asyncio.Lock()
|
2019-04-02 20:46:36 +00:00
|
|
|
revert_task = None
|
2018-06-03 12:16:14 +00:00
|
|
|
|
|
|
|
|
2018-11-01 21:04:15 +00:00
|
|
|
def fix_title(s):
|
|
|
|
# Ideally this would be a state machine, but ¯\_(ツ)_/¯
|
|
|
|
def replace(m):
|
|
|
|
token = m.group(1)
|
|
|
|
if token.lower() == 'and':
|
|
|
|
token = '&'
|
2018-11-01 21:24:17 +00:00
|
|
|
return token[0].upper() + token[1:] + (' ' if m.group(2) else '')
|
2018-11-01 21:04:15 +00:00
|
|
|
return re.sub(r'(\S+)(\s+)?', replace, s)
|
|
|
|
|
|
|
|
|
2019-04-27 10:22:23 +00:00
|
|
|
async def edit_title(chat, title):
|
2018-11-22 14:02:48 +00:00
|
|
|
try:
|
|
|
|
await borg(EditTitleRequest(
|
2019-04-27 10:22:23 +00:00
|
|
|
channel=chat, title=title
|
2018-11-22 14:02:48 +00:00
|
|
|
))
|
|
|
|
except ChatNotModifiedError:
|
|
|
|
pass # Everything is ok
|
2018-06-03 12:16:14 +00:00
|
|
|
|
|
|
|
|
2019-04-27 10:22:23 +00:00
|
|
|
async def wait_and_revert(chat_id, timeout):
|
2019-04-27 10:05:46 +00:00
|
|
|
await asyncio.sleep(timeout)
|
2019-04-27 10:22:23 +00:00
|
|
|
await edit_title(chat_id, DEFAULT_TITLES[chat_id])
|
2019-04-02 20:46:36 +00:00
|
|
|
|
|
|
|
|
2018-06-03 12:16:14 +00:00
|
|
|
@borg.on(events.NewMessage(
|
2019-04-27 10:22:23 +00:00
|
|
|
pattern=re.compile(r"(?i)programming (?:&|and) (.+)"),
|
|
|
|
chats=list(DEFAULT_TITLES.keys())))
|
2018-06-03 12:16:14 +00:00
|
|
|
async def on_name(event):
|
2019-04-02 20:46:36 +00:00
|
|
|
global revert_task
|
2018-11-01 21:04:15 +00:00
|
|
|
new_topic = fix_title(event.pattern_match.group(1))
|
2018-06-10 19:54:00 +00:00
|
|
|
new_title = f"Programming & {new_topic}"
|
|
|
|
if "Tech" not in new_title:
|
|
|
|
new_title += " & Tech"
|
2018-06-03 12:16:14 +00:00
|
|
|
|
2019-04-02 20:21:26 +00:00
|
|
|
if len(new_title) > 255 or rename_lock.locked():
|
2018-06-03 12:16:14 +00:00
|
|
|
return
|
|
|
|
|
2019-04-27 10:15:40 +00:00
|
|
|
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'
|
|
|
|
)
|
|
|
|
|
2019-04-02 20:21:26 +00:00
|
|
|
with (await rename_lock):
|
2019-04-27 10:22:23 +00:00
|
|
|
await edit_title(event.chat_id, new_title)
|
2019-04-27 10:05:46 +00:00
|
|
|
await asyncio.sleep(MULTI_EDIT_TIMEOUT)
|
2019-04-02 20:46:36 +00:00
|
|
|
|
|
|
|
if revert_task and not revert_task.done():
|
|
|
|
revert_task.cancel()
|
2019-04-27 10:22:23 +00:00
|
|
|
revert_task = asyncio.create_task(
|
|
|
|
wait_and_revert(event.chat_id, REVERT_TIMEOUT))
|