mirror of
https://github.com/miloszowi/everyone-mention-telegram-bot.git
synced 2025-05-20 09:14:07 +00:00
added group and user entities, modified repositories method names to more accurate
This commit is contained in:
parent
9c15227cbf
commit
c22338b7c1
34
src/entities/group.py
Normal file
34
src/entities/group.py
Normal file
@ -0,0 +1,34 @@
|
||||
from typing import Iterable
|
||||
from .user import User
|
||||
|
||||
class Group():
|
||||
__id: int
|
||||
__users: Iterable[User] = []
|
||||
|
||||
def __init__(self, id: int) -> None:
|
||||
self.__id = id
|
||||
|
||||
def getId(self) -> int:
|
||||
return self.__id
|
||||
|
||||
def setUsers(self, users: Iterable[User]) -> None:
|
||||
self.__users = users
|
||||
|
||||
def addUser(self, user: User) -> None:
|
||||
self.__users.append(user)
|
||||
|
||||
def removeUser(self, user: User) -> None:
|
||||
for index, groupUser in enumerate(self.__users):
|
||||
if groupUser.getId() == user.getId():
|
||||
del self.__users[index]
|
||||
|
||||
def getUsers(self) -> Iterable[User]:
|
||||
return self.__users
|
||||
|
||||
def hasUser(self, user: User) -> bool:
|
||||
userIds = [int(groupUser.getId()) for groupUser in self.getUsers()]
|
||||
|
||||
if user.getId() in userIds:
|
||||
return True
|
||||
|
||||
return False
|
19
src/entities/user.py
Normal file
19
src/entities/user.py
Normal file
@ -0,0 +1,19 @@
|
||||
from typing import Optional
|
||||
|
||||
class User():
|
||||
__id: int
|
||||
__username: Optional[str]
|
||||
__groupId: int
|
||||
|
||||
def __init__(self, id: int, username: Optional[str]) -> None:
|
||||
self.__id = id
|
||||
self.__username = username
|
||||
|
||||
def getId(self) -> int:
|
||||
return self.__id
|
||||
|
||||
def getUsername(self) -> Optional[str]:
|
||||
return self.__username
|
||||
|
||||
def getGroupId(self) -> int:
|
||||
return self.__groupId
|
@ -1,6 +1,6 @@
|
||||
from ..config.contents import opted_in_successfully, opted_in_failed
|
||||
from ..repositories.userRepository import UserRepository
|
||||
from ..firebaseProxy import FirebaseProxy
|
||||
from ..entities.user import User
|
||||
from ..repositories.groupRepository import GroupRepository
|
||||
from .handlerInterface import HandlerInterface
|
||||
from telegram.ext.callbackcontext import CallbackContext
|
||||
from telegram.ext.commandhandler import CommandHandler
|
||||
@ -18,18 +18,17 @@ class InHandler(HandlerInterface):
|
||||
)
|
||||
|
||||
def handle(self, update: Update, context: CallbackContext) -> None:
|
||||
groupId = update.effective_chat.id
|
||||
userData = {
|
||||
FirebaseProxy.id_index: update.effective_user.id,
|
||||
FirebaseProxy.name_index: update.effective_user.username
|
||||
}
|
||||
userRepository = UserRepository()
|
||||
groupRepository = GroupRepository()
|
||||
group = groupRepository.get(update.effective_chat.id)
|
||||
user = User(update.effective_user.id, update.effective_user.username)
|
||||
|
||||
if userRepository.isPresentInGroup(userData.get(FirebaseProxy.id_index), groupId):
|
||||
if group.hasUser(user):
|
||||
update.message.reply_markdown_v2(text=opted_in_failed)
|
||||
return
|
||||
|
||||
userRepository.addForGroup(userData, groupId)
|
||||
group.addUser(user)
|
||||
groupRepository.save(group)
|
||||
|
||||
update.message.reply_markdown_v2(text=opted_in_successfully)
|
||||
|
||||
def getBotHandler(self) -> CommandHandler:
|
||||
|
@ -1,4 +1,6 @@
|
||||
from ..config.contents import mention_failed
|
||||
from ..entities.group import Group
|
||||
from ..entities.user import User
|
||||
from ..firebaseProxy import FirebaseProxy
|
||||
from ..repositories.groupRepository import GroupRepository
|
||||
from .handlerInterface import HandlerInterface
|
||||
@ -30,13 +32,11 @@ class MentionHandler(HandlerInterface):
|
||||
def getCommandName(self) -> str:
|
||||
return self.commandName
|
||||
|
||||
def buildMentionMessage(self, usersData: dict) -> str:
|
||||
def buildMentionMessage(self, group: Group) -> str:
|
||||
result = ''
|
||||
|
||||
for userData in usersData:
|
||||
userId = str(userData.get(FirebaseProxy.id_index))
|
||||
username = userData.get(FirebaseProxy.name_index) or userId
|
||||
|
||||
result += "*[%s](tg://user?id=%s)* " % (username, userId)
|
||||
for user in group.getUsers():
|
||||
username = user.getUsername() or user.getId()
|
||||
result += f'*[{username}](tg://user?id={user.getId()})* '
|
||||
|
||||
return result or mention_failed
|
||||
|
@ -1,5 +1,6 @@
|
||||
from ..config.contents import opted_off_successfully, opted_off_failed
|
||||
from ..repositories.userRepository import UserRepository
|
||||
from ..entities.user import User
|
||||
from ..repositories.groupRepository import GroupRepository
|
||||
from .handlerInterface import HandlerInterface
|
||||
from telegram.ext.callbackcontext import CallbackContext
|
||||
from telegram.ext.commandhandler import CommandHandler
|
||||
@ -17,20 +18,18 @@ class OutHandler(HandlerInterface):
|
||||
)
|
||||
|
||||
def handle(self, update: Update, context: CallbackContext) -> None:
|
||||
groupId = update.effective_chat.id
|
||||
userData = {
|
||||
'id': update.effective_user.id,
|
||||
'name': update.effective_user.username
|
||||
}
|
||||
groupRepository = GroupRepository()
|
||||
group = groupRepository.get(update.effective_chat.id)
|
||||
user = User(update.effective_user.id, update.effective_user.username)
|
||||
|
||||
userRepository = UserRepository()
|
||||
if not userRepository.isPresentInGroup(userData.get('id'), groupId):
|
||||
update.message.reply_markdown_v2(text=opted_off_failed)
|
||||
if group.hasUser(user):
|
||||
group.removeUser(user)
|
||||
groupRepository.save(group)
|
||||
|
||||
update.message.reply_markdown_v2(text=opted_off_successfully)
|
||||
return
|
||||
|
||||
userRepository.removeForGroup(userId=userData.get('id'), groupId=groupId)
|
||||
|
||||
update.message.reply_markdown_v2(text=opted_off_successfully)
|
||||
update.message.reply_markdown_v2(text=opted_off_failed)
|
||||
|
||||
def getBotHandler(self) -> CommandHandler:
|
||||
return self.botHandler
|
||||
|
@ -1,3 +1,5 @@
|
||||
from ..entities.group import Group
|
||||
from ..entities.user import User
|
||||
from ..firebaseProxy import FirebaseProxy
|
||||
|
||||
|
||||
@ -7,12 +9,40 @@ class GroupRepository():
|
||||
def __init__(self) -> None:
|
||||
self.firebase = FirebaseProxy()
|
||||
|
||||
def get(self, id: int) -> dict:
|
||||
result = []
|
||||
groupData = self.firebase.getChilds(FirebaseProxy.group_index, id).get()
|
||||
def get(self, id: int) -> Group:
|
||||
group = Group(id)
|
||||
fbData = self.firebase.getChilds(FirebaseProxy.group_index, id).get()
|
||||
users = []
|
||||
|
||||
if groupData.each():
|
||||
for user_root in groupData.each():
|
||||
result.append(user_root.val())
|
||||
for userData in fbData.each() or []:
|
||||
userData = userData.val()
|
||||
users.append(
|
||||
User(
|
||||
userData.get(FirebaseProxy.id_index),
|
||||
userData.get(FirebaseProxy.name_index)
|
||||
)
|
||||
)
|
||||
|
||||
return result
|
||||
group.setUsers(users)
|
||||
|
||||
return group
|
||||
|
||||
def save(self, group: Group) -> None:
|
||||
users = {}
|
||||
|
||||
if not group.getUsers():
|
||||
self.remove(group)
|
||||
|
||||
for user in group.getUsers():
|
||||
users[user.getId()] = {
|
||||
FirebaseProxy.id_index: user.getId(),
|
||||
FirebaseProxy.name_index: user.getUsername()
|
||||
}
|
||||
|
||||
self.firebase.getChilds(
|
||||
FirebaseProxy.group_index,
|
||||
group.getId()
|
||||
).update(users)
|
||||
|
||||
def remove(self, group: Group) -> None:
|
||||
self.firebase.getChilds(FirebaseProxy.group_index, group.getId()).remove()
|
@ -7,24 +7,6 @@ class UserRepository():
|
||||
def __init__(self) -> None:
|
||||
self.firebaseProxy = FirebaseProxy()
|
||||
|
||||
def addForGroup(self, userData: dict, groupId: int) -> None:
|
||||
self.firebaseProxy.getChilds(FirebaseProxy.getGroupPath(groupId)).update({
|
||||
f'{groupId}_{userData.get("id")}': {
|
||||
FirebaseProxy.id_index: userData.get("id"),
|
||||
FirebaseProxy.name_index: userData.get("name")
|
||||
}
|
||||
})
|
||||
|
||||
def removeForGroup(self, userId: int, groupId: int) -> None:
|
||||
self.firebaseProxy.getChilds(FirebaseProxy.getGroupPath(groupId)).update({
|
||||
FirebaseProxy.getUserPath(userId, groupId): {}
|
||||
})
|
||||
|
||||
def isPresentInGroup(self, userId: int, groupId: int) -> bool:
|
||||
user = self.firebaseProxy.getChilds(
|
||||
FirebaseProxy.getGroupPath(groupId),
|
||||
FirebaseProxy.getUserPath(userId, groupId)
|
||||
).get().val()
|
||||
|
||||
return bool(user)
|
||||
# TODO : this repository needs to handle user save/deletion/update
|
||||
# right now, all of those above is handled by GroupRepository
|
||||
|
Loading…
x
Reference in New Issue
Block a user