@@ -42,13 +42,22 @@ def __init__(self, logger, core, config_file):
4242 self .cycle_enabled = self .configs .get ('cycle_enabled' , True )
4343 self .cycle_index = 0
4444 self .cycle_timer = QtCore .QTimer (self )
45- self .cycle_timer .timeout .connect (self .cycle_timer_action ) # type: ignore[attr-defined]
4645 self .std_cyc_interval_ms = self .configs .get ('sec_between_cycle' , self ._default_cycle_interval ) * 1000 # msec
47- self .cycle_timer .start (self .std_cyc_interval_ms ) # start cycle timer
4846 self ._cycle_remaining_ms = 0 # msec
47+ self .cycle_timer .setInterval (self .std_cyc_interval_ms )
48+ self .cycle_timer .timeout .connect (self .cycle_timer_action ) # type: ignore[attr-defined]
49+ if self .cycle_enabled :
50+ self .cycle_timer .start () # start cycle timer
51+
52+ # initialize view timer
53+ self .view_timer = QtCore .QTimer (self )
54+ self .view_timer .setSingleShot (True )
55+ self .view_timer .timeout .connect (self .view_timer_end ) # type: ignore[attr-defined]
4956
5057 # connect signals and slots
5158 self .utils .sig_input .connect (self .on_player_input )
59+ self .utils .sig_login .connect (self .on_player_login )
60+ self .utils .sig_logout .connect (self .on_player_logout )
5261
5362 # available commands
5463 self .cmd_list = {
@@ -69,6 +78,7 @@ def unknown_command(self, player):
6978 self .utils .tell (player , f'Unknown command. Type "{ self ._cmd_prefix } help" for help.' )
7079
7180
81+ ## Slots for mcBasicLib signals
7282 @QtCore .pyqtSlot (tuple )
7383 def on_player_input (self , pair ):
7484 self .logger .debug (f'{ self .__class__ .__name__ } .on_player_input() called' )
@@ -81,6 +91,42 @@ def on_player_input(self, pair):
8191 else :
8292 self .unknown_command (player )
8393
94+ @QtCore .pyqtSlot (object )
95+ def on_player_login (self , player ):
96+ self .logger .debug (f'{ self .__class__ .__name__ } .on_player_login() called for player { player .name } ' )
97+ # when a player logs in, check if cycle timer is paused,
98+ # if paused, resume the cycle timer.
99+ if len (self .utils .get_online_player_list ()) == 1 : # first player online
100+ self .logger .debug ('First player logged in. Resuming cycle timer if paused.' )
101+ if self .cycle_enabled and not self .cycle_timer .isActive ():
102+ if self ._cycle_remaining_ms > 0 :
103+ self .cycle_timer .start (self ._cycle_remaining_ms )
104+ self .logger .debug (f'Cycle timer resumed with { self ._cycle_remaining_ms } ms remaining.' )
105+ self ._cycle_remaining_ms = 0
106+ else :
107+ self .cycle_timer .start ()
108+ self .logger .debug ('Cycle timer started normally.' )
109+ else :
110+ self .logger .debug ('Cycle disabled or is already running; no action taken.' )
111+
112+ @QtCore .pyqtSlot (object )
113+ def on_player_logout (self , player ):
114+ self .logger .debug (f'{ self .__class__ .__name__ } .on_player_logout() called for player { player .name } ' )
115+ # when a player logs out, check online list,
116+ # if no players online, end the view timer and pause the cycle timer.
117+ if len (self .utils .get_online_player_list ()) == 0 :
118+ self .logger .debug ('No players online. Ending view timer and pausing cycle timer.' )
119+ if self .view_timer .isActive ():
120+ self .view_timer .stop ()
121+ self .view_timer_end ()
122+ self .logger .debug ('View timer ended.' )
123+ if self .cycle_enabled :
124+ self ._cycle_remaining_ms = self .cycle_timer .remainingTime ()
125+ self .cycle_timer .stop ()
126+ self .logger .debug (f'Cycle timer paused with { self ._cycle_remaining_ms } ms remaining.' )
127+ else :
128+ self .logger .debug ('Cycle disabled; no action taken.' )
129+
84130
85131 def update_config_json (self ):
86132 json .dump (self .configs , open (self .config_file , 'w' , encoding = 'utf-8' ), indent = 4 )
@@ -110,7 +156,7 @@ def view_timer_end(self):
110156 if self .cycle_enabled :
111157 if self ._cycle_remaining_ms > 0 :
112158 self .cycle_timer .start (self ._cycle_remaining_ms )
113- self ._cycle_remaining_ms = 0 # Reset instead of delete to avoid attribute error
159+ self ._cycle_remaining_ms = 0
114160 else :
115161 self .cycle_timer .start ()
116162
@@ -176,9 +222,6 @@ def view_sb(self, player, args: list):
176222 self .core .write_server (f'/scoreboard objectives setdisplay sidebar { sb_name } ' )
177223 view_interval = self .configs .get ('sec_view_stay' , self ._default_view_stay ) # sec
178224 self .utils .tell (player , f'Viewing \' { sb_name } \' for { view_interval } seconds.' )
179- self .view_timer = QtCore .QTimer (self )
180- self .view_timer .timeout .connect (self .view_timer_end ) # type: ignore[attr-defined]
181- self .view_timer .setSingleShot (True )
182225 self .view_timer .start (view_interval * 1000 )
183226
184227
@@ -187,7 +230,7 @@ def skip_sb(self, player, args: list):
187230 self .unknown_command (player )
188231 return
189232
190- if hasattr ( self , 'view_timer' ) and self .view_timer .isActive (): # player is viewing a selected scoreboard
233+ if self .view_timer .isActive (): # player is viewing a selected scoreboard
191234 self .logger .debug ('skip_sb(): view timer is active.' )
192235 self .view_timer .stop ()
193236 self .view_timer_end ()
0 commit comments