handle mod updates
All checks were successful
Build and Push Docker Image / build (push) Successful in 13s
All checks were successful
Build and Push Docker Image / build (push) Successful in 13s
This commit is contained in:
parent
95e8672fd5
commit
c947aa2148
@ -4,11 +4,13 @@ Reads and handles updates in the server console file.
|
|||||||
|
|
||||||
import re
|
import re
|
||||||
import logging
|
import logging
|
||||||
|
import asyncio
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
import aiofiles
|
import aiofiles
|
||||||
|
from rcon.source import rcon
|
||||||
from discord import Embed, Colour
|
from discord import Embed, Colour
|
||||||
from discord.ext import commands, tasks
|
from discord.ext import commands, tasks
|
||||||
|
|
||||||
@ -88,7 +90,7 @@ class ConsoleCog(commands.Cog):
|
|||||||
Determine how to handle the given line from the server console.
|
Determine how to handle the given line from the server console.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
if "CheckModsNeedUpdate" in line:
|
if "CheckModsNeedUpdate: Mods need update" in line:
|
||||||
await self.handle_mod_needs_update(line)
|
await self.handle_mod_needs_update(line)
|
||||||
|
|
||||||
elif "ConnectionManager: [fully-connected]" in line:
|
elif "ConnectionManager: [fully-connected]" in line:
|
||||||
@ -97,8 +99,49 @@ class ConsoleCog(commands.Cog):
|
|||||||
elif "ConnectionManager: [disconnect]" in line:
|
elif "ConnectionManager: [disconnect]" in line:
|
||||||
await self.handle_player_left(line)
|
await self.handle_player_left(line)
|
||||||
|
|
||||||
|
async def alert_and_wait_for_restart(self, intervals_ms: list[int], reason: str):
|
||||||
|
for interval_ms in intervals_ms:
|
||||||
|
seconds_remaining = interval_ms / 1000
|
||||||
|
log.info("Planned restart in %s seconds, reason: %s", seconds_remaining, reason)
|
||||||
|
await rcon("Planned restart in %s seconds, reason: %s", seconds_remaining, reason, **self.bot.rcon_details)
|
||||||
|
while seconds_remaining > 0:
|
||||||
|
await asyncio.sleep(1)
|
||||||
|
seconds_remaining -= 1
|
||||||
|
|
||||||
|
async def kick_all_users(self):
|
||||||
|
players_message = await rcon("players", **self.bot.rcon_details)
|
||||||
|
re_pattern = r"Players connected \(\d+\):\s*(-[\w-]+(?:\s*[\w-]+)*)"
|
||||||
|
re_match = re.search(re_pattern, players_message)
|
||||||
|
if not re_match:
|
||||||
|
log.info("No players found to kick")
|
||||||
|
|
||||||
|
usernames_string = re_match.group(1)
|
||||||
|
for i, username in enumerate(usernames_string.split("-")):
|
||||||
|
if not username:
|
||||||
|
continue
|
||||||
|
|
||||||
|
await rcon(f'kickuser "{username}" -r "Server is Updating. Kicked to ensure your progress is saved"', **self.bot.rcon_details)
|
||||||
|
|
||||||
|
log.info("Kicked '%s' users for restart", i + 1)
|
||||||
|
|
||||||
async def handle_mod_needs_update(self, line: str):
|
async def handle_mod_needs_update(self, line: str):
|
||||||
log.debug("mod update instruction: %s", line)
|
"""
|
||||||
|
Report when one or more mods need to be updated.
|
||||||
|
"""
|
||||||
|
log.info("one or more mods are outdated")
|
||||||
|
|
||||||
|
await self.alert_and_wait_for_restart(
|
||||||
|
intervals_ms=[300000, 60000, 6000],
|
||||||
|
reason="Mod needs updating"
|
||||||
|
)
|
||||||
|
await self.kick_all_users()
|
||||||
|
await rcon("save", **self.bot.rcon_details)
|
||||||
|
await rcon("quit", **self.bot.rcon_details)
|
||||||
|
|
||||||
|
channel = self.bot.get_channel(self.bot.in_game_channel_id)
|
||||||
|
channel = await self.bot.fetch_channel(self.bot.in_game_channel_id) if not channel else channel
|
||||||
|
await channel.send(content="The server is currently being restarted for mod updates.")
|
||||||
|
|
||||||
|
|
||||||
async def handle_player_joined(self, line: str):
|
async def handle_player_joined(self, line: str):
|
||||||
"""
|
"""
|
||||||
@ -118,7 +161,7 @@ class ConsoleCog(commands.Cog):
|
|||||||
steam_id=re_match.group(3),
|
steam_id=re_match.group(3),
|
||||||
access=re_match.group(4),
|
access=re_match.group(4),
|
||||||
username=re_match.group(5),
|
username=re_match.group(5),
|
||||||
connection_type=re_match.group(6),
|
connection_type=re_match.group(6)
|
||||||
)
|
)
|
||||||
|
|
||||||
channel = self.bot.get_channel(self.bot.in_game_channel_id)
|
channel = self.bot.get_channel(self.bot.in_game_channel_id)
|
||||||
@ -152,7 +195,7 @@ class ConsoleCog(commands.Cog):
|
|||||||
steam_id=re_match.group(3),
|
steam_id=re_match.group(3),
|
||||||
access=re_match.group(4),
|
access=re_match.group(4),
|
||||||
username=re_match.group(5),
|
username=re_match.group(5),
|
||||||
connection_type=re_match.group(6),
|
connection_type=re_match.group(6)
|
||||||
)
|
)
|
||||||
|
|
||||||
channel = self.bot.get_channel(self.bot.in_game_channel_id)
|
channel = self.bot.get_channel(self.bot.in_game_channel_id)
|
||||||
|
Reference in New Issue
Block a user