Skip to content

Commit a70aafb

Browse files
committed
ENHANCEMENTS:
- Scheduler: countdown added
1 parent 2237415 commit a70aafb

File tree

5 files changed

+47
-15
lines changed

5 files changed

+47
-15
lines changed

plugins/scheduler/README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,14 @@ The main structure of the scheduler.yaml consists out of these blocks:
2020

2121
a) DEFAULT Section
2222
```yaml
23-
DEFAULT: # the DEFAULT block is valid for ALL your servers
24-
startup_delay: 10 # delay in seconds between the startup of each DCS instance (default: 10)
25-
warn: # warn times before a restart / shutdown (see an alternative format below)
26-
text: '!!! {item} will {what} in {when} !!!' # Message to be displayed as a popup in DCS. These variables can be used in your own message.
27-
times: # List of times when a message will be displayed
23+
DEFAULT: # the DEFAULT block is valid for ALL your servers
24+
startup_delay: 10 # delay in seconds between the startup of each DCS instance (default: 10)
25+
warn: # warn times before a restart / shutdown (see an alternative format below)
26+
message: '!!! {item} will {what} in {when} !!!' # Message to be displayed as a popup in DCS. These variables can be used in your own message.
27+
countdown: # Optional: Send a countdown
28+
time: 10 # ... 10 seconds before shutdown
29+
message: '!!! {item} will {what} in {when} !!!' # Optional: Message to be sent (default: warn/message)
30+
times: # List of times when a message will be displayed
2831
- 600
2932
- 300
3033
- 60

plugins/scheduler/commands.py

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,18 @@ def change_instance_3_3(instance: dict):
9090
instance['timezone'] = 'UTC'
9191
action['times'] = action.pop('utc_times')
9292

93+
def change_instance_3_4(instance: dict):
94+
if 'warn' in instance and 'text' in instance['warn']:
95+
instance['warn']['message'] = instance['warn'].pop('text')
96+
9397
if new_version == '3.1':
9498
change_instance = change_instance_3_1
9599
elif new_version == '3.2':
96100
change_instance = change_instance_3_2
97101
elif new_version == '3.3':
98102
change_instance = change_instance_3_3
103+
elif new_version == '3.4':
104+
change_instance = change_instance_3_4
99105
else:
100106
return
101107

@@ -245,7 +251,7 @@ async def warn_users(self, server: Server, config: dict, rconf: dict, max_warn_t
245251
times: list | dict = warn.get('times', [0])
246252
if isinstance(times, list):
247253
warn_times = sorted(times, reverse=True)
248-
warn_text = warn.get('text', '!!! {item} will {what} in {when} !!!')
254+
warn_text = warn.get('message', '!!! {item} will {what} in {when} !!!')
249255
elif isinstance(times, dict):
250256
warn_times = sorted(times.keys(), reverse=True)
251257
else:
@@ -292,8 +298,26 @@ async def do_warn(warn_time: int):
292298
if math.ceil(i/(60 if i >= 60 else 1)) <= math.ceil(restart_in/(60 if i >= 60 else 1))
293299
]
294300
await utils.run_parallel_nofail(*tasks)
295-
# sleep until the restart should happen
296-
await asyncio.sleep(min(restart_in, min(warn_times)))
301+
302+
if warn.get('countdown'):
303+
timer = min(restart_in, min(warn_times))
304+
countdown = warn['countdown'].get('time', 10)
305+
warn_text = warn.get('message', warn['countdown'].get('message', 0))
306+
while timer > countdown:
307+
await asyncio.sleep(1)
308+
timer -= 1
309+
while timer != 0:
310+
message = warn_text.format(item=item, what=action, when=utils.format_time(timer))
311+
await server.sendPopupMessage(Coalition.ALL, message, 1)
312+
await server.sendChatMessage(Coalition.ALL, message)
313+
await asyncio.sleep(1)
314+
timer -= 1
315+
316+
# sleep until the countdown should happen
317+
await asyncio.sleep(min(restart_in, min(warn_times)))
318+
else:
319+
# sleep until the restart should happen
320+
await asyncio.sleep(min(restart_in, min(warn_times)))
297321

298322
async def teardown_dcs(self, server: Server, member: discord.Member | None = None):
299323
await self.bot.bus.send_to_node({"command": "onShutdown", "server_name": server.name})

plugins/scheduler/schemas/scheduler_schema.yaml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,18 @@ schema;element_schema:
7070
type: map
7171
nullable: false
7272
mapping:
73-
text: {type: str, nullable: false}
73+
message: {type: str, nullable: false}
7474
sound: {type: str, nullable: false}
7575
times:
7676
type: any
7777
nullable: false
7878
func: seq_or_map
7979
enum: ['warn_seq', 'warn_map']
80+
countdown:
81+
type: map
82+
mapping:
83+
time: {type: int, range: {min: 0}, nullable: false}
84+
message: {type: str, nullable: false}
8085
schedule:
8186
type: map
8287
nullable: false

plugins/scheduler/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "3.3"
1+
__version__ = "3.4"

samples/plugins/scheduler.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
DEFAULT:
2-
startup_delay: 10 # delay in seconds between the startup of each DCS instance (default: 10)
3-
warn: # warn times before a restart / shutdown
4-
text: '!!! {item} will {what} in {when} !!!' # Message to be displayed as a popup in DCS. These variables can be used in your own message.
5-
times: # List of times when a message will be displayed
2+
startup_delay: 10 # delay in seconds between the startup of each DCS instance (default: 10)
3+
warn: # warn times before a restart / shutdown
4+
message: '!!! {item} will {what} in {when} !!!' # Message to be displayed as a popup in DCS. These variables can be used in your own message.
5+
times: # List of times when a message will be displayed
66
- 600
77
- 300
88
- 60
@@ -18,7 +18,7 @@ instance2:
1818
00-12: YYYYYYY
1919
12-24: NNNNNNN
2020
action: # at 04:00 and 08:00 LT ...
21-
local_times:
21+
times:
2222
- 04:00
2323
- 08:00
2424
method: rotate # .. it will rotate ..

0 commit comments

Comments
 (0)