mirror of
https://github.com/miloszowi/everyone-mention-telegram-bot.git
synced 2025-11-08 23:35:52 +00:00
changed mongoDb collection structure, removed group entity & repository, updated README.md, changed folder names to singular forms
This commit is contained in:
24
src/handler/abstractHandler.py
Executable file
24
src/handler/abstractHandler.py
Executable file
@@ -0,0 +1,24 @@
|
||||
from abc import abstractmethod
|
||||
|
||||
from telegram.ext.callbackcontext import CallbackContext
|
||||
from telegram.ext.handler import Handler
|
||||
from telegram.update import Update
|
||||
|
||||
from handler.vo.updateData import UpdateData
|
||||
|
||||
|
||||
class AbstractHandler:
|
||||
def __init__(self) -> None:
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def getBotHandler(self) -> Handler: raise Exception('getBotHandler method is not implemented')
|
||||
|
||||
@abstractmethod
|
||||
def handle(self, update: Update, context: CallbackContext) -> None: raise Exception('handle method is not implemented')
|
||||
|
||||
def getUpdateData(self, update: Update) -> UpdateData:
|
||||
return UpdateData.createFromUpdate(update)
|
||||
|
||||
def reply(self, update: Update, message: str) -> None:
|
||||
update.effective_message.reply_markdown_v2(text=message)
|
||||
38
src/handler/inHandler.py
Executable file
38
src/handler/inHandler.py
Executable file
@@ -0,0 +1,38 @@
|
||||
from config.contents import opted_in, opted_in_failed
|
||||
from exception.notFoundException import NotFoundException
|
||||
from repository.userRepository import UserRepository
|
||||
from telegram.ext.callbackcontext import CallbackContext
|
||||
from telegram.ext.commandhandler import CommandHandler
|
||||
from telegram.update import Update
|
||||
|
||||
from handler.abstractHandler import AbstractHandler
|
||||
|
||||
|
||||
class InHandler(AbstractHandler):
|
||||
botHandler: CommandHandler
|
||||
userRepository: UserRepository
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.botHandler = CommandHandler('in', self.handle)
|
||||
self.userRepository = UserRepository()
|
||||
|
||||
def handle(self, update: Update, context: CallbackContext) -> None:
|
||||
updateData = self.getUpdateData(update)
|
||||
|
||||
try:
|
||||
user = self.userRepository.getById(updateData.getUserId())
|
||||
|
||||
if user.isInChat(updateData.getChatId()):
|
||||
self.reply(update, opted_in_failed)
|
||||
return
|
||||
|
||||
user.addToChat(updateData.getChatId())
|
||||
self.userRepository.save(user)
|
||||
|
||||
except NotFoundException:
|
||||
self.userRepository.saveByUpdateData(updateData)
|
||||
|
||||
self.reply(update, opted_in)
|
||||
|
||||
def getBotHandler(self) -> CommandHandler:
|
||||
return self.botHandler
|
||||
40
src/handler/mentionHandler.py
Executable file
40
src/handler/mentionHandler.py
Executable file
@@ -0,0 +1,40 @@
|
||||
from typing import Iterable
|
||||
|
||||
from config.contents import mention_failed
|
||||
from entity.user import User
|
||||
from repository.userRepository import UserRepository
|
||||
from telegram.ext.callbackcontext import CallbackContext
|
||||
from telegram.ext.commandhandler import CommandHandler
|
||||
from telegram.update import Update
|
||||
|
||||
from handler.abstractHandler import AbstractHandler
|
||||
|
||||
|
||||
class MentionHandler(AbstractHandler):
|
||||
botHandler: CommandHandler
|
||||
userRepository: UserRepository
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.botHandler = CommandHandler('everyone', self.handle)
|
||||
self.userRepository = UserRepository()
|
||||
|
||||
def handle(self, update: Update, context: CallbackContext) -> None:
|
||||
updateData = self.getUpdateData(update)
|
||||
users = self.userRepository.getAllForChat(updateData.getChatId())
|
||||
|
||||
if users:
|
||||
self.reply(update, self.buildMentionMessage(users))
|
||||
return
|
||||
|
||||
self.reply(update, mention_failed)
|
||||
|
||||
def getBotHandler(self) -> CommandHandler:
|
||||
return self.botHandler
|
||||
|
||||
def buildMentionMessage(self, users: Iterable[User]) -> str:
|
||||
result = ''
|
||||
|
||||
for user in users:
|
||||
result += f'*[{user.getUsername()}](tg://user?id={user.getUserId()})* '
|
||||
|
||||
return result
|
||||
36
src/handler/outHandler.py
Executable file
36
src/handler/outHandler.py
Executable file
@@ -0,0 +1,36 @@
|
||||
from config.contents import opted_off, opted_off_failed
|
||||
from exception.notFoundException import NotFoundException
|
||||
from repository.userRepository import UserRepository
|
||||
from telegram.ext.callbackcontext import CallbackContext
|
||||
from telegram.ext.commandhandler import CommandHandler
|
||||
from telegram.update import Update
|
||||
|
||||
from handler.abstractHandler import AbstractHandler
|
||||
|
||||
|
||||
class OutHandler(AbstractHandler):
|
||||
botHandler: CommandHandler
|
||||
userRepository: UserRepository
|
||||
|
||||
def __init__(self) -> None:
|
||||
self.botHandler = CommandHandler('out', self.handle)
|
||||
self.userRepository = UserRepository()
|
||||
|
||||
def handle(self, update: Update, context: CallbackContext) -> None:
|
||||
updateData = self.getUpdateData(update)
|
||||
|
||||
try:
|
||||
user = self.userRepository.getById(updateData.getUserId())
|
||||
if not user.isInChat(updateData.getChatId()):
|
||||
raise NotFoundException()
|
||||
except NotFoundException:
|
||||
self.reply(update, opted_off_failed)
|
||||
return
|
||||
|
||||
user.removeFromChat(updateData.getChatId())
|
||||
self.userRepository.save(user)
|
||||
|
||||
self.reply(update, opted_off)
|
||||
|
||||
def getBotHandler(self) -> CommandHandler:
|
||||
return self.botHandler
|
||||
36
src/handler/vo/updateData.py
Normal file
36
src/handler/vo/updateData.py
Normal file
@@ -0,0 +1,36 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import names
|
||||
from telegram.update import Update
|
||||
|
||||
|
||||
class UpdateData():
|
||||
userId: str
|
||||
chatId: str
|
||||
username: str
|
||||
|
||||
def __init__(self, userId: str, chatId: str, username: str) -> None:
|
||||
self.userId = userId
|
||||
self.chatId = chatId
|
||||
self.username = username
|
||||
|
||||
def getUserId(self) -> str:
|
||||
return self.userId
|
||||
|
||||
def getChatId(self) -> str:
|
||||
return self.chatId
|
||||
|
||||
def getUsername(self) -> str:
|
||||
return self.username
|
||||
|
||||
@staticmethod
|
||||
def createFromUpdate(update: Update) -> UpdateData:
|
||||
userId = str(update.effective_user.id)
|
||||
chatId = str(update.effective_chat.id)
|
||||
chatId = "-284685928"
|
||||
username = update.effective_user.username or update.effective_user.first_name
|
||||
|
||||
if not username:
|
||||
username = names.get_first_name()
|
||||
|
||||
return UpdateData(userId, chatId, username)
|
||||
Reference in New Issue
Block a user