Fixed voice state update (ontime) handling

This commit is contained in:
2023-01-19 20:02:56 +01:00
parent 53cdaf3fa0
commit e1c89814da
5 changed files with 70 additions and 28 deletions

View File

@@ -16,7 +16,7 @@
"LicenseName": "MIT",
"LicenseDescription": "MIT, see LICENSE for more details.",
"Dependencies": [
"cpl-core==2022.12.1.post2",
"cpl-core==2022.12.1.post3",
"cpl-translation==2022.12.1",
"cpl-query==2022.12.2.post1",
"cpl-discord==2022.12.1.post2",
@@ -31,7 +31,7 @@
"icmplib==3.0.3"
],
"DevDependencies": [
"cpl-cli==2022.12.1.post2"
"cpl-cli==2022.12.1.post3"
],
"PythonVersion": ">=3.10.4",
"PythonPath": {},

View File

@@ -48,7 +48,7 @@ class BaseOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
self._logger.info(__name__, f"Module {type(self)} loaded")
def _update_voice_state(self, joined: bool, dc_user_id: int, dc_channel_id: int, server: Server, switch=False):
def _switch_voice_state(self, dc_user_id: int, before_dc_channel_id: int, after_dc_channel_id: int, server: Server):
user: Optional[User] = None
try:
user = self._users.get_user_by_discord_id_and_server_id(dc_user_id, server.server_id)
@@ -62,16 +62,50 @@ class BaseOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
try:
end_date = datetime.now()
if joined and not switch:
join = UserJoinedVoiceChannel(user, before_dc_channel_id, end_date)
self._user_joins_vc.add_user_joined_voice_channel(join)
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id)
join = self._user_joins_vc.get_active_user_joined_voice_channel_by_user_id(user.user_id)
join.leaved_on = end_date
# ontime as hours
ontime = round((join.leaved_on - join.joined_on).total_seconds() / 3600, 2)
old_xp = user.xp
user.xp += round(ontime * settings.xp_per_ontime_hour)
self._user_joins_vc.update_user_joined_voice_channel(join)
self._users.update_user(user)
self._db.save_changes()
self._logger.debug(
__name__,
f"User {user} leaved_on {join.leaved_on}. Ontime: {ontime}h | xp: from {old_xp} to {user.xp}",
)
except Exception as e:
self._logger.error(__name__, f"Ontime validation failed", e)
def _update_voice_state(self, joined: bool, dc_user_id: int, dc_channel_id: int, server: Server):
user: Optional[User] = None
try:
user = self._users.get_user_by_discord_id_and_server_id(dc_user_id, server.server_id)
except Exception as e:
self._logger.error(__name__, f"Cannot get user {dc_user_id}", e)
return
if user is None:
self._logger.error(__name__, f"User not found {dc_user_id}")
return
try:
end_date = datetime.now()
if joined:
join = UserJoinedVoiceChannel(user, dc_channel_id, end_date)
self._user_joins_vc.add_user_joined_voice_channel(join)
self._db.save_changes()
return
elif joined and switch:
join = UserJoinedVoiceChannel(user, dc_channel_id, end_date)
self._user_joins_vc.add_user_joined_voice_channel(join)
settings: BaseServerSettings = self._base_helper.get_config(server.discord_server_id)
join = self._user_joins_vc.get_active_user_joined_voice_channel_by_user_id(user.user_id)
@@ -139,8 +173,11 @@ class BaseOnVoiceStateUpdateEvent(OnVoiceStateUpdateABC):
self._logger.trace(__name__, f"User {member.id} left {before.channel}")
self._update_voice_state(False, member.id, before.channel.id, server)
else:
elif (
before.channel.id not in settings.afk_channel_ids
and after.channel.id not in settings.afk_channel_ids
):
self._logger.trace(__name__, f"User {member.id} switched to {after.channel}")
self._update_voice_state(True, member.id, before.channel.id, server, True)
self._switch_voice_state(member.id, before.channel.id, after.channel.id, server)
except Exception as e:
self._logger.error(__name__, f"Cannot handle voice state for user {member.id}", e)

View File

@@ -271,6 +271,7 @@ class DatabaseOnReadyEvent(OnReadyABC):
self._logger.debug(__name__, f"Start checking UserJoinedVoiceChannel table")
for guild in self._bot.guilds:
guild: discord.Guild = guild
settings: BaseServerSettings = self._config.get_configuration(f"BaseServerSettings_{guild.id}")
server = self._servers.find_server_by_discord_id(guild.id)
if server is None:
@@ -296,7 +297,6 @@ class DatabaseOnReadyEvent(OnReadyABC):
f"Active UserJoinedVoiceChannel found in database: {guild.id}:{member.id}@{join.joined_on}",
)
join.leaved_on = datetime.now()
settings: BaseServerSettings = self._config.get_configuration(f"BaseServerSettings_{guild.id}")
if (
(join.leaved_on - join.joined_on).total_seconds() / 60 / 60
@@ -312,7 +312,7 @@ class DatabaseOnReadyEvent(OnReadyABC):
self._logger.trace(__name__, f"User {member.id} is ignored, because its a bot")
continue
if member.voice is None:
if member.voice is None or member.voice.channel.id in settings.afk_channel_ids:
continue
user = self._users.find_user_by_discord_id_and_server_id(member.id, server.server_id)