From a4149d59d12fdb6192cd3d3be0c04be712b028ec Mon Sep 17 00:00:00 2001 From: Conatum Date: Sun, 14 May 2023 12:29:30 +0300 Subject: [PATCH] rewrite: Update voice tracker config. --- src/tracking/voice/cog.py | 10 ++-- src/tracking/voice/session.py | 8 +++ src/tracking/voice/settings.py | 105 +++++++++++++++++++++++++++++++-- 3 files changed, 114 insertions(+), 9 deletions(-) diff --git a/src/tracking/voice/cog.py b/src/tracking/voice/cog.py index 7b25c33f..1235e6e9 100644 --- a/src/tracking/voice/cog.py +++ b/src/tracking/voice/cog.py @@ -47,8 +47,8 @@ class VoiceTrackerCog(LionCog): self.bot.core.guild_config.register_model_setting(self.settings.HourlyReward) self.bot.core.guild_config.register_model_setting(self.settings.HourlyLiveBonus) - self.bot.core.guild_config.register_model_setting(self.settings.UntrackedChannels) self.bot.core.guild_config.register_model_setting(self.settings.DailyVoiceCap) + self.bot.core.guild_config.register_setting(self.settings.UntrackedChannels) # Update the tracked voice channel cache await self.settings.UntrackedChannels.setup(self.bot) @@ -607,10 +607,10 @@ class VoiceTrackerCog(LionCog): pass @configure_group.command( - name=_p('cmd:configure_voice_tracking', "voice_tracking"), + name=_p('cmd:configure_voice_rates', "voice_rewards"), description=_p( - 'cmd:configure_voice_tracking|desc', - "Voice tracking configuration panel" + 'cmd:configure_voice_rates|desc', + "Configure Voice tracking rewards and experience" ) ) @appcmds.rename( @@ -695,6 +695,6 @@ class VoiceTrackerCog(LionCog): if ctx.channel.id not in VoiceTrackerConfigUI._listening or not modified: # Launch setting group UI - configui = VoiceTrackerConfigUI(self.bot, self.settings, ctx.guild.id, ctx.channel.id) + configui = VoiceTrackerConfigUI(self.bot, ctx.guild.id, ctx.channel.id) await configui.run(ctx.interaction) await configui.wait() diff --git a/src/tracking/voice/session.py b/src/tracking/voice/session.py index 0e3700ec..00b5d7ae 100644 --- a/src/tracking/voice/session.py +++ b/src/tracking/voice/session.py @@ -232,6 +232,14 @@ class VoiceSession: # End the ongoing session await self.data.close_study_session_at(self.guildid, self.userid, utc_now()) + # Rank update + # TODO: Change to broadcasted event? + rank_cog = self.bot.get_cog('RankCog') + if rank_cog is not None: + asyncio.create_task(rank_cog.on_voice_session_complete( + (self.guildid, self.userid, int((utc_now() - self.data.start_time).total_seconds()), 0) + )) + if self.start_task is not None: self.start_task.cancel() self.start_task = None diff --git a/src/tracking/voice/settings.py b/src/tracking/voice/settings.py index b0bfe35e..4e02d2a0 100644 --- a/src/tracking/voice/settings.py +++ b/src/tracking/voice/settings.py @@ -1,4 +1,5 @@ from typing import Optional +import asyncio from collections import defaultdict import discord from discord.ui.select import select, Select, ChannelSelect @@ -11,7 +12,8 @@ from settings.setting_types import ChannelListSetting, IntegerSetting, DurationS from meta import conf, LionBot from meta.sharding import THIS_SHARD from meta.logger import log_wrap -from utils.ui import LeoUI +from utils.lib import MessageArgs +from utils.ui import LeoUI, ConfigUI, DashboardSection from core.data import CoreData from core.lion_guild import VoiceMode @@ -101,6 +103,10 @@ class VoiceTrackerSettings(SettingGroup): 'guildset:hourly_reward|mode:voice|desc', "LionCoins given per hour in a voice channel." ) + _long_desc = _p( + 'guildset:hourly_reward|mode:voice|long_desc', + "Number of LionCoins to each member per hour that they stay in a tracked voice channel." + ) _default = 50 _min = 0 @@ -136,7 +142,7 @@ class VoiceTrackerSettings(SettingGroup): ) _long_desc = _p( 'guildset:hourly_reward|mode:voice|long_desc', - "Number of LionCoins to each member per hour that they stay in a tracked voice channel." + "Number of LionCoins rewarded to each member per hour that they stay in a tracked voice channel." ) @property @@ -274,7 +280,7 @@ class VoiceTrackerSettings(SettingGroup): ) -class VoiceTrackerConfigUI(LeoUI): +class VoiceTrackerConfigUIALT(LeoUI): # TODO: Bulk edit # TODO: Cohesive exit # TODO: Back to main configuration panel @@ -303,6 +309,7 @@ class VoiceTrackerConfigUI(LeoUI): return (self.hourly_reward, self.hourly_live_bonus, self.daily_voice_cap, self.untracked_channels) async def cleanup(self): + # TODO: Swap cleanup and close.. self._listening.pop(self.channelid, None) for instance in self.instances: instance.deregister_callback(self.id) @@ -362,7 +369,7 @@ class VoiceTrackerConfigUI(LeoUI): if interaction.response.is_done(): # Use followup to respond - self._mesage = await interaction.followup.send(embed=self.embed, view=self) + self._message = await interaction.followup.send(embed=self.embed, view=self) else: # Use interaction response to respond self._original = interaction @@ -431,3 +438,93 @@ class VoiceTrackerConfigUI(LeoUI): for setting in self.instances: embed.add_field(**setting.embed_field, inline=False) return embed + + +class VoiceTrackerConfigUI(ConfigUI): + setting_classes = ( + VoiceTrackerSettings.HourlyReward, + VoiceTrackerSettings.HourlyLiveBonus, + VoiceTrackerSettings.DailyVoiceCap, + VoiceTrackerSettings.UntrackedChannels, + ) + + def __init__(self, bot: LionBot, + guildid: int, channelid: int, **kwargs): + self.settings = bot.get_cog('VoiceTrackerCog').settings + super().__init__(bot, guildid, channelid, **kwargs) + + @select( + cls=ChannelSelect, + placeholder="UNTRACKED_CHANNELS_PLACEHOLDER", + min_values=0, max_values=25 + ) + async def untracked_channels_menu(self, selection: discord.Interaction, selected): + await selection.response.defer() + setting = self.instances[3] + setting.value = selected.values + await setting.write() + + async def untracked_channels_menu_refresh(self): + t = self.bot.translator.t + self.untracked_channels_menu.placeholder = t(_p( + 'ui:voice_tracker_config|menu:untracked_channels|placeholder', + "Select Untracked Channels" + )) + + async def make_message(self): + t = self.bot.translator.t + lguild = await self.bot.core.lions.fetch_guild(self.guildid) + mode = lguild.guild_mode + if mode.voice is VoiceMode.VOICE: + title = t(_p( + 'ui:voice_tracker_config|mode:voice|embed|title', + "Voice Tracker Configuration Panel" + )) + else: + title = t(_p( + 'ui:voice_tracker_config|mode:study|embed|title', + "Study Tracker Configuration Panel" + )) + embed = discord.Embed( + colour=discord.Colour.orange(), + title=title + ) + for setting in self.instances: + embed.add_field(**setting.embed_field, inline=False) + + args = MessageArgs(embed=embed) + return args + + async def reload(self): + lguild = await self.bot.core.lions.fetch_guild(self.guildid) + if lguild.guild_mode.voice is VoiceMode.VOICE: + hourly_reward = await self.settings.HourlyReward_Voice.get(self.guildid) + else: + hourly_reward = await self.settings.HourlyReward_Study.get(self.guildid) + hourly_live_bonus = lguild.config.get('hourly_live_bonus') + daily_voice_cap = lguild.config.get('daily_voice_cap') + untracked_channels = await self.settings.UntrackedChannels.get(self.guildid) + self.instances = ( + hourly_reward, hourly_live_bonus, daily_voice_cap, untracked_channels + ) + + async def refresh_components(self): + await asyncio.gather( + self.edit_button_refresh(), + self.close_button_refresh(), + self.reset_button_refresh(), + self.untracked_channels_menu_refresh(), + ) + self._layout = [ + (self.untracked_channels_menu,), + (self.edit_button, self.reset_button, self.close_button) + ] + + +class VoiceTrackerDashboard(DashboardSection): + section_name = _p( + 'dash:voice_tracker|title', + "Voice Tracker Configuration" + ) + configui = VoiceTrackerConfigUI + setting_classes = configui.setting_classes