Compare commits

...

3 Commits

Author SHA1 Message Date
Dan Elkouby cc98721120 Improve command support
- Support commands with the bot's username
- Make matching case-insensitive by default
- Merge cmd and admin_cmd for better maintainability
2020-08-02 15:32:44 +00:00
Dan Elkouby b97d1649a4 Port tl plugin to bots 2020-08-02 15:08:46 +00:00
Dan Elkouby dd49e13fbf Merge "plugins" plugin into _core 2020-08-02 14:47:19 +00:00
5 changed files with 54 additions and 36 deletions

1
botplugins/tl.py Symbolic link
View File

@ -0,0 +1 @@
../stdplugins/tl.py

View File

@ -1,17 +0,0 @@
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"""
Show all loaded .plugins
"""
from telethon import events
@borg.on(events.NewMessage(pattern=r"\.plugins", outgoing=True))
async def _(event):
result = f'{len(borg._plugins)} plugins loaded:'
for name, mod in sorted(borg._plugins.items(), key=lambda t: t[0]):
desc = (mod.__doc__ or '__no description__').replace('\n', ' ').strip()
result += f'\n**{name}**: {desc}'
await event.edit(result)

View File

@ -12,7 +12,7 @@ import mimetypes
import re
import time
from telethon import events, helpers, types
from telethon import helpers, types
mimetypes.add_type('audio/mpeg', '.borg+tts')
@ -308,11 +308,11 @@ class Translator:
translator = Translator()
@borg.on(events.NewMessage(pattern=r"\.tl", outgoing=True))
@borg.on(borg.cmd(r"tl"))
async def _(event):
if event.is_reply:
text = (await event.get_reply_message()).raw_text
else:
elif not borg.me.bot:
text = ''
started = False
async for m in borg.iter_messages(event.chat_id):
@ -326,14 +326,18 @@ async def _(event):
text = m.raw_text + '\n' + text
else:
text = m.raw_text + ' ' + text
else:
return
translated = await translator.translate(text.strip())
await event.edit('translation: ' + translated, parse_mode=None)
action = event.edit if not borg.me.bot else event.respond
await action('translation: ' + translated, parse_mode=None)
@borg.on(events.NewMessage(pattern=r"\.tts", outgoing=True))
@borg.on(borg.cmd(r"tts"))
async def _(event):
await event.delete()
if not borg.me.bot:
await event.delete()
ts = event.raw_text.split(maxsplit=1)
text = None if len(ts) < 2 else ts[1]
@ -349,7 +353,7 @@ async def _(event):
await borg.send_file(
event.chat_id,
file,
reply_to=event.reply_to_msg_id,
reply_to=event.reply_to_msg_id if not borg.me.bot else None,
attributes=[types.DocumentAttributeAudio(
duration=0,
voice=True

View File

@ -8,7 +8,7 @@ import traceback
DELETE_TIMEOUT = 2
@borg.on(borg.admin_cmd(r"(?:re)?load (?P<shortname>\w+)"))
@borg.on(borg.admin_cmd(r"(?:re)?load", r"(?P<shortname>\w+)"))
async def load_reload(event):
if not borg.me.bot:
await event.delete()
@ -31,7 +31,7 @@ async def load_reload(event):
await event.respond(f"Failed to (re)load plugin {shortname}: {e}")
@borg.on(borg.admin_cmd(r"(?:unload|disable|remove) (?P<shortname>\w+)"))
@borg.on(borg.admin_cmd(r"(?:unload|disable|remove)", r"(?P<shortname>\w+)"))
async def remove(event):
if not borg.me.bot:
await event.delete()
@ -48,3 +48,16 @@ async def remove(event):
if not borg.me.bot:
await asyncio.sleep(DELETE_TIMEOUT)
await borg.delete_messages(msg.to_id, msg)
@borg.on(borg.admin_cmd(r"plugins"))
async def list_plugins(event):
result = f'{len(borg._plugins)} plugins loaded:'
for name, mod in sorted(borg._plugins.items(), key=lambda t: t[0]):
desc = (mod.__doc__ or '__no description__').replace('\n', ' ').strip()
result += f'\n**{name}**: {desc}'
if not borg.me.bot:
await event.edit(result)
else:
await event.respond(result)

View File

@ -110,14 +110,31 @@ class Uniborg(TelegramClient):
return fut
def admin_cmd(self, pattern):
if not self.me.bot:
return telethon.events.NewMessage(
outgoing=True,
pattern=fr'^\.{pattern}$'
)
def cmd(self, command, pattern=None, admin_only=False):
if self.me.bot:
command = fr'{command}(?:@{self.me.username})?'
if pattern is not None:
pattern = fr'{command}\s+{pattern}'
else:
return telethon.events.NewMessage(
from_users=self.admins,
pattern=fr'^\/{pattern}$'
)
pattern = command
if not self.me.bot:
pattern=fr'^\.{pattern}'
else:
pattern=fr'^\/{pattern}'
pattern=fr'(?i){pattern}$'
if self.me.bot and admin_only:
allowed_users = self.admins
else:
allowed_users = None
return telethon.events.NewMessage(
outgoing=not self.me.bot,
from_users=allowed_users,
pattern=pattern
)
def admin_cmd(self, command, pattern=None):
return self.cmd(command, pattern, admin_only=True)