forked from platypush/platypush
Support for group events and lists of authorized chat_ids
This commit is contained in:
parent
846d5ff2eb
commit
1de3296c85
2 changed files with 70 additions and 11 deletions
|
@ -1,11 +1,12 @@
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from typing import Type
|
from typing import Type, Optional, Union, List
|
||||||
|
|
||||||
from platypush.backend import Backend
|
from platypush.backend import Backend
|
||||||
from platypush.context import get_plugin
|
from platypush.context import get_plugin
|
||||||
from platypush.message.event.chat.telegram import MessageEvent, CommandMessageEvent, TextMessageEvent, \
|
from platypush.message.event.chat.telegram import MessageEvent, CommandMessageEvent, TextMessageEvent, \
|
||||||
PhotoMessageEvent, VideoMessageEvent, ContactMessageEvent, DocumentMessageEvent, LocationMessageEvent
|
PhotoMessageEvent, VideoMessageEvent, ContactMessageEvent, DocumentMessageEvent, LocationMessageEvent, \
|
||||||
|
GroupChatCreatedEvent
|
||||||
from platypush.plugins.chat.telegram import ChatTelegramPlugin
|
from platypush.plugins.chat.telegram import ChatTelegramPlugin
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,6 +23,7 @@ class ChatTelegramBackend(Backend):
|
||||||
* :class:`platypush.message.event.chat.telegram.ContactMessageEvent` when a contact is received.
|
* :class:`platypush.message.event.chat.telegram.ContactMessageEvent` when a contact is received.
|
||||||
* :class:`platypush.message.event.chat.telegram.DocumentMessageEvent` when a document is received.
|
* :class:`platypush.message.event.chat.telegram.DocumentMessageEvent` when a document is received.
|
||||||
* :class:`platypush.message.event.chat.telegram.CommandMessageEvent` when a command message is received.
|
* :class:`platypush.message.event.chat.telegram.CommandMessageEvent` when a command message is received.
|
||||||
|
* :class:`platypush.message.event.chat.telegram.GroupCreatedEvent` when the bot is invited to a new group.
|
||||||
|
|
||||||
Requires:
|
Requires:
|
||||||
|
|
||||||
|
@ -29,16 +31,63 @@ class ChatTelegramBackend(Backend):
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, authorized_chat_ids: Optional[List[Union[str, int]]] = None, **kwargs):
|
||||||
|
"""
|
||||||
|
:param authorized_chat_ids: Optional list of chat_id/user_id which are authorized to send messages to
|
||||||
|
the bot. If nothing is specified then no restrictions are applied.
|
||||||
|
"""
|
||||||
|
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
self.authorized_chat_ids = set(authorized_chat_ids or [])
|
||||||
self._plugin: ChatTelegramPlugin = get_plugin('chat.telegram')
|
self._plugin: ChatTelegramPlugin = get_plugin('chat.telegram')
|
||||||
|
|
||||||
|
def _authorize(self, msg):
|
||||||
|
if not self.authorized_chat_ids:
|
||||||
|
return
|
||||||
|
|
||||||
|
if msg.chat.type == 'private' and msg.chat.id not in self.authorized_chat_ids:
|
||||||
|
self.logger.info('Received message from unauthorized chat_id {}'.format(msg.chat.id))
|
||||||
|
self._plugin.send_message(chat_id=msg.chat.id, text='You are not allowed to send messages to this bot')
|
||||||
|
raise PermissionError
|
||||||
|
|
||||||
def _msg_hook(self, cls: Type[MessageEvent]):
|
def _msg_hook(self, cls: Type[MessageEvent]):
|
||||||
# noinspection PyUnusedLocal
|
# noinspection PyUnusedLocal
|
||||||
def hook(update, context):
|
def hook(update, context):
|
||||||
self.bus.post(cls(chat_id=update.effective_chat.id,
|
msg = update.effective_message
|
||||||
message=self._plugin.parse_msg(update.effective_message).output,
|
|
||||||
user=self._plugin.parse_user(update.effective_user).output))
|
try:
|
||||||
|
self._authorize(msg)
|
||||||
|
self.bus.post(cls(chat_id=update.effective_chat.id,
|
||||||
|
message=self._plugin.parse_msg(msg).output,
|
||||||
|
user=self._plugin.parse_user(update.effective_user).output))
|
||||||
|
except PermissionError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return hook
|
||||||
|
|
||||||
|
def _group_hook(self):
|
||||||
|
# noinspection PyUnusedLocal
|
||||||
|
def hook(update, context):
|
||||||
|
msg = update.effective_message
|
||||||
|
if msg.group_chat_created:
|
||||||
|
self.bus.post(GroupChatCreatedEvent(chat_id=update.effective_chat.id,
|
||||||
|
message=self._plugin.parse_msg(msg).output,
|
||||||
|
user=self._plugin.parse_user(update.effective_user).output))
|
||||||
|
elif msg.photo:
|
||||||
|
self._msg_hook(PhotoMessageEvent)(update, context)
|
||||||
|
elif msg.video:
|
||||||
|
self._msg_hook(VideoMessageEvent)(update, context)
|
||||||
|
elif msg.contact:
|
||||||
|
self._msg_hook(ContactMessageEvent)(update, context)
|
||||||
|
elif msg.location:
|
||||||
|
self._msg_hook(LocationMessageEvent)(update, context)
|
||||||
|
elif msg.document:
|
||||||
|
self._msg_hook(DocumentMessageEvent)(update, context)
|
||||||
|
elif msg.text:
|
||||||
|
if msg.text.startswith('/'):
|
||||||
|
self._command_hook()(update, context)
|
||||||
|
else:
|
||||||
|
self._msg_hook(TextMessageEvent)(update, context)
|
||||||
|
|
||||||
return hook
|
return hook
|
||||||
|
|
||||||
|
@ -49,11 +98,16 @@ class ChatTelegramBackend(Backend):
|
||||||
m = re.match('\s*/([0-9a-zA-Z_-]+)\s*(.*)', msg.text)
|
m = re.match('\s*/([0-9a-zA-Z_-]+)\s*(.*)', msg.text)
|
||||||
cmd = m.group(1).lower()
|
cmd = m.group(1).lower()
|
||||||
args = [arg for arg in re.split('\s+', m.group(2)) if len(arg)]
|
args = [arg for arg in re.split('\s+', m.group(2)) if len(arg)]
|
||||||
self.bus.post(CommandMessageEvent(chat_id=update.effective_chat.id,
|
|
||||||
command=cmd,
|
try:
|
||||||
cmdargs=args,
|
self._authorize(msg)
|
||||||
message=self._plugin.parse_msg(msg).output,
|
self.bus.post(CommandMessageEvent(chat_id=update.effective_chat.id,
|
||||||
user=self._plugin.parse_user(update.effective_user).output))
|
command=cmd,
|
||||||
|
cmdargs=args,
|
||||||
|
message=self._plugin.parse_msg(msg).output,
|
||||||
|
user=self._plugin.parse_user(update.effective_user).output))
|
||||||
|
except PermissionError:
|
||||||
|
pass
|
||||||
|
|
||||||
return hook
|
return hook
|
||||||
|
|
||||||
|
@ -65,6 +119,7 @@ class ChatTelegramBackend(Backend):
|
||||||
telegram = self._plugin.get_telegram()
|
telegram = self._plugin.get_telegram()
|
||||||
dispatcher = telegram.dispatcher
|
dispatcher = telegram.dispatcher
|
||||||
|
|
||||||
|
dispatcher.add_handler(MessageHandler(Filters.group, self._group_hook()))
|
||||||
dispatcher.add_handler(MessageHandler(Filters.text, self._msg_hook(TextMessageEvent)))
|
dispatcher.add_handler(MessageHandler(Filters.text, self._msg_hook(TextMessageEvent)))
|
||||||
dispatcher.add_handler(MessageHandler(Filters.photo, self._msg_hook(PhotoMessageEvent)))
|
dispatcher.add_handler(MessageHandler(Filters.photo, self._msg_hook(PhotoMessageEvent)))
|
||||||
dispatcher.add_handler(MessageHandler(Filters.video, self._msg_hook(VideoMessageEvent)))
|
dispatcher.add_handler(MessageHandler(Filters.video, self._msg_hook(VideoMessageEvent)))
|
||||||
|
|
|
@ -48,4 +48,8 @@ class DocumentMessageEvent(MessageEvent):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class GroupChatCreatedEvent(MessageEvent):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# vim:sw=4:ts=4:et:
|
# vim:sw=4:ts=4:et:
|
||||||
|
|
Loading…
Reference in a new issue