Added logic to handle max message xp per hour #168

This commit is contained in:
2023-01-11 20:13:09 +01:00
parent a216506a37
commit 1ff70af72b
27 changed files with 177 additions and 80 deletions

View File

@@ -1,4 +1,5 @@
from abc import ABC, abstractmethod
from datetime import datetime
from typing import Optional
from cpl_query.extension import List
@@ -10,22 +11,27 @@ class UserMessageCountPerHourRepositoryABC(ABC):
@abstractmethod
def __init__(self): pass
@abstractmethod
def get_user_message_count_per_hours(self) -> List[UserMessageCountPerHour]: pass
@abstractmethod
def find_user_message_count_per_hours_by_user_id(self, user_id: int) -> List[Optional[UserMessageCountPerHour]]: pass
def find_user_message_count_per_hour_by_user_id(self, user_id: int) -> Optional[UserMessageCountPerHour]: pass
@abstractmethod
def find_user_message_count_per_hours_by_user_id_and_active_hour(self, user_id: int) -> List[Optional[UserMessageCountPerHour]]: pass
def get_user_message_count_per_hour_by_user_id_and_date(self, user_id: int, date: datetime) -> \
Optional[UserMessageCountPerHour]: pass
@abstractmethod
def find_user_message_count_per_hour_by_user_id_and_date(self, user_id: int, date: datetime) -> \
Optional[UserMessageCountPerHour]: pass
@abstractmethod
def add_user_message_count_per_hour(self, umcph: UserMessageCountPerHour): pass
@abstractmethod
def update_user_message_count_per_hour(self, umcph: UserMessageCountPerHour): pass
@abstractmethod
def delete_user_message_count_per_hour(self, umcph: UserMessageCountPerHour): pass

View File

@@ -19,9 +19,9 @@ class UserMessageCountPerHourMigration(MigrationABC):
str(f"""
CREATE TABLE IF NOT EXISTS `UserMessageCountPerHour` (
`Id` BIGINT NOT NULL AUTO_INCREMENT,
`Date` DATETIME(6) NOT NULL,
`Date` VARCHAR(255) NOT NULL,
`Hour` BIGINT,
`Count` BIGINT,
`XPCount` BIGINT,
`UserId` BIGINT,
`CreatedAt` DATETIME(6),
`LastModifiedAt` DATETIME(6),

View File

@@ -29,6 +29,7 @@ class Level(TableABC):
@name.setter
def name(self, value: str):
self._modified_at = datetime.now().isoformat()
self._name = value
@property
@@ -37,6 +38,7 @@ class Level(TableABC):
@color.setter
def color(self, value: str):
self._modified_at = datetime.now().isoformat()
self._color = value
@property
@@ -45,6 +47,7 @@ class Level(TableABC):
@min_xp.setter
def min_xp(self, value: int):
self._modified_at = datetime.now().isoformat()
self._min_xp = value
@property
@@ -53,6 +56,7 @@ class Level(TableABC):
@permissions.setter
def permissions(self, value: int):
self._modified_at = datetime.now().isoformat()
self._permissions = value
@property
@@ -61,6 +65,7 @@ class Level(TableABC):
@server.setter
def server(self, value: Server):
self._modified_at = datetime.now().isoformat()
self._server = value
@staticmethod

View File

@@ -9,9 +9,9 @@ class UserMessageCountPerHour(TableABC):
def __init__(
self,
date: datetime,
date: str,
hour: int,
count: int,
xp_count: int,
user: User,
created_at: datetime = None,
modified_at: datetime = None,
@@ -19,7 +19,7 @@ class UserMessageCountPerHour(TableABC):
self._id = id
self._date = date
self._hour = hour
self._count = count
self._xp_count = xp_count
self._user = user
TableABC.__init__(self)
@@ -39,8 +39,13 @@ class UserMessageCountPerHour(TableABC):
return self._hour
@property
def count(self) -> int:
return self._count
def xp_count(self) -> int:
return self._xp_count
@xp_count.setter
def xp_count(self, value: int):
self._modified_at = datetime.now().isoformat()
self._xp_count = value
@property
def user(self) -> User:
@@ -67,27 +72,26 @@ class UserMessageCountPerHour(TableABC):
""")
@staticmethod
def get_select_by_user_id_and_current_hour_string(id: int) -> str:
now = datetime.now()
date = f'{now.year}-{now.month}-{now.day}%'
def get_select_by_user_id_and_date_string(id: int, date: datetime) -> str:
date_str = f'{str(date.year).zfill(4)}-{str(date.month).zfill(2)}-{str(date.day).zfill(2)}%'
return str(f"""
SELECT * FROM `UserMessageCountPerHour`
WHERE `UserId` = {id}
AND `Date` LIKE '{date}'
AND `Hour` = {now.hour};
AND `Date` LIKE '{date_str}'
AND `Hour` = {date.hour};
""")
@property
def insert_string(self) -> str:
return str(f"""
INSERT INTO `UserMessageCountPerHour` (
`UserId`, `Date`, `JoinedOn`, `Count`, `CreatedAt`, `LastModifiedAt`
`UserId`, `Date`, `Hour`, `XPCount`, `CreatedAt`, `LastModifiedAt`
) VALUES (
{self._user.user_id},
'{self._date}',
{self._hour},
{self._count},
{self._xp_count},
'{self._created_at}',
'{self._modified_at}'
);
@@ -97,7 +101,7 @@ class UserMessageCountPerHour(TableABC):
def udpate_string(self) -> str:
return str(f"""
UPDATE `UserMessageCountPerHour`
SET `Count` = '{self._count}',
SET `XPCount` = '{self._xp_count}',
`LastModifiedAt` = '{self._modified_at}'
WHERE `Id` = {self._id};
""")

View File

@@ -1,3 +1,4 @@
from datetime import datetime
from typing import Optional
from cpl_core.database.context import DatabaseContextABC
@@ -16,14 +17,12 @@ class UserMessageCountPerHourRepositoryService(UserMessageCountPerHourRepository
logger: DatabaseLogger,
db_context: DatabaseContextABC,
users: UserRepositoryABC,
umcphs: UserMessageCountPerHourRepositoryABC,
):
UserMessageCountPerHourRepositoryABC.__init__(self)
self._logger = logger
self._context = db_context
self._users = users
self._umcphs = umcphs
@staticmethod
def _get_value_from_result(value: any) -> Optional[any]:
@@ -53,7 +52,7 @@ class UserMessageCountPerHourRepositoryService(UserMessageCountPerHourRepository
return umcphs
def find_user_message_count_per_hours_by_user_id(self, user_id: int) -> List[Optional[UserMessageCountPerHour]]:
def find_user_message_count_per_hour_by_user_id(self, user_id: int) -> List[Optional[UserMessageCountPerHour]]:
umcphs = List(UserMessageCountPerHour)
sql = UserMessageCountPerHour.get_select_by_user_id_string(user_id)
self._logger.trace(__name__, f'Send SQL command: {sql}')
@@ -67,21 +66,22 @@ class UserMessageCountPerHourRepositoryService(UserMessageCountPerHourRepository
return umcphs
def find_user_message_count_per_hours_by_user_id_and_active_hour(self, user_id: int) -> List[
Optional[UserMessageCountPerHour]
]:
umcphs = List(UserMessageCountPerHour)
sql = UserMessageCountPerHour.get_select_by_user_id_and_current_hour_string(user_id)
def get_user_message_count_per_hour_by_user_id_and_date(self, user_id: int, date: datetime) -> \
Optional[UserMessageCountPerHour]:
sql = UserMessageCountPerHour.get_select_by_user_id_and_date_string(user_id, date)
self._logger.trace(__name__, f'Send SQL command: {sql}')
results = self._context.select(sql)
if results is None or len(results) == 0:
return umcphs
result = self._context.select(sql)[0]
return self._from_result(result)
for result in results:
self._logger.trace(__name__, f'Get user message count per hour with id {result[0]}')
umcphs.append(self._from_result(result))
def find_user_message_count_per_hour_by_user_id_and_date(self, user_id: int, date: datetime) -> \
Optional[UserMessageCountPerHour]:
sql = UserMessageCountPerHour.get_select_by_user_id_and_date_string(user_id, date)
self._logger.trace(__name__, f'Send SQL command: {sql}')
result = self._context.select(sql)
if result is None or len(result) == 0:
return None
return umcphs
return self._from_result(result[0])
def add_user_message_count_per_hour(self, umcph: UserMessageCountPerHour):
self._logger.trace(__name__, f'Send SQL command: {umcph.insert_string}')