user class and join/leave embeds
All checks were successful
Build and Push Docker Image / build (push) Successful in 12s
All checks were successful
Build and Push Docker Image / build (push) Successful in 12s
This commit is contained in:
parent
5e216862a6
commit
21bd1589a4
@ -5,14 +5,34 @@ Reads and handles updates in the server console file.
|
||||
import re
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from dataclasses import dataclass
|
||||
|
||||
import aiofiles
|
||||
from discord import Embed, Colour
|
||||
from discord.ext import commands, tasks
|
||||
|
||||
CONSOLE_FILE_PATH = Path(__file__).parent.parent / "data" / "server-console.txt"
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class ZomboidUser:
|
||||
guid: str
|
||||
ip: str
|
||||
steam_id: str
|
||||
access: str
|
||||
username: str
|
||||
connection_type: str
|
||||
|
||||
@property
|
||||
def steam_profile_picture_url(self):
|
||||
return f"https://steamcommunity.com/profiles/{self.steam_id}/profileimage?width=256"
|
||||
|
||||
@property
|
||||
def steam_url(self):
|
||||
return f"https://steamcommunity.com/profiles/{self.steam_id}"
|
||||
|
||||
|
||||
class ConsoleCog(commands.Cog):
|
||||
"""
|
||||
Reads and handles the server-console.txt file.
|
||||
@ -54,6 +74,10 @@ class ConsoleCog(commands.Cog):
|
||||
self._last_line_number = await file.tell()
|
||||
|
||||
async def process_console_line(self, line: str):
|
||||
"""
|
||||
Determine how to handle the given line from the server console.
|
||||
"""
|
||||
|
||||
if "CheckModsNeedUpdate" in line:
|
||||
await self.handle_mod_needs_update(line)
|
||||
|
||||
@ -67,51 +91,72 @@ class ConsoleCog(commands.Cog):
|
||||
log.debug("mod update instruction: %s", line)
|
||||
|
||||
async def handle_player_joined(self, line: str):
|
||||
# example for connect:
|
||||
# ConnectionManager: [fully-connected] "" connection: guid=1733487070761473 ip=192.168.1.23 steam-id=76561198202697217 access=admin username="corbz" connection-type="UDPRakNet"
|
||||
"""
|
||||
Report when a user has joined the server into a specified Discord channel.
|
||||
Example of line:
|
||||
ConnectionManager: [fully-connected] "" connection: guid=*** ip=*** steam-id=*** access=admin username="corbz" connection-type="UDPRakNet"
|
||||
"""
|
||||
re_pattern = r"guid=(\d+) ip=([\d\.]+) steam-id=(\d+) access=(\w+) username=\"([^\"]+)\" connection-type=\"([^\"]+)\""
|
||||
re_match = re.search(re_pattern, line)
|
||||
if not re_match:
|
||||
log.warning("failed to parse player data: %s", line)
|
||||
return
|
||||
|
||||
data = {
|
||||
"guid": re_match.group(1),
|
||||
"ip": re_match.group(2),
|
||||
"steam_id": re_match.group(3),
|
||||
"access": re_match.group(4),
|
||||
"username": re_match.group(5),
|
||||
"connection_type": re_match.group(6),
|
||||
}
|
||||
user = ZomboidUser(
|
||||
guid=re_match.group(1),
|
||||
ip=re_match.group(2),
|
||||
steam_id=re_match.group(3),
|
||||
access=re_match.group(4),
|
||||
username=re_match.group(5),
|
||||
connection_type=re_match.group(6),
|
||||
)
|
||||
|
||||
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=f"Player Joined: **{data['username']}**")
|
||||
embed = Embed(
|
||||
title=user.username,
|
||||
url=user.steam_url,
|
||||
description="Player has joined the server",
|
||||
colour=Colour.brand_green()
|
||||
)
|
||||
embed.set_image(user.steam_profile_picture_url)
|
||||
|
||||
await channel.send(embed=embed)
|
||||
|
||||
async def handle_player_left(self, line: str):
|
||||
# Example for disconnect:
|
||||
# ConnectionManager: [disconnect] "receive-disconnect" connection: guid=1733487070761473 ip=192.168.1.23 steam-id=76561198202697217 access=admin username="corbz" connection-type="Disconnected"
|
||||
|
||||
"""
|
||||
Report when a user has left the server into a specified Discord channel.
|
||||
Example of line:
|
||||
ConnectionManager: [disconnect] "receive-disconnect" connection: guid=*** ip=*** steam-id=*** access=admin username="corbz" connection-type="Disconnected"
|
||||
"""
|
||||
re_pattern = r"guid=(\d+) ip=([\d\.]+) steam-id=(\d+) access=(\w+) username=\"([^\"]+)\" connection-type=\"([^\"]+)\""
|
||||
re_match = re.search(re_pattern, line)
|
||||
if not re_match:
|
||||
log.warning("failed to parse player data: %s", line)
|
||||
return
|
||||
|
||||
data = {
|
||||
"guid": re_match.group(1),
|
||||
"ip": re_match.group(2),
|
||||
"steam_id": re_match.group(3),
|
||||
"access": re_match.group(4),
|
||||
"username": re_match.group(5),
|
||||
"connection_type": re_match.group(6),
|
||||
}
|
||||
user = ZomboidUser(
|
||||
guid=re_match.group(1),
|
||||
ip=re_match.group(2),
|
||||
steam_id=re_match.group(3),
|
||||
access=re_match.group(4),
|
||||
username=re_match.group(5),
|
||||
connection_type=re_match.group(6),
|
||||
)
|
||||
|
||||
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=f"Player Left: **{data['username']}**")
|
||||
embed = Embed(
|
||||
title=user.username,
|
||||
url=user.steam_url,
|
||||
description="Player has left the server",
|
||||
colour=Colour.brand_red()
|
||||
)
|
||||
embed.set_image(user.steam_profile_picture_url)
|
||||
|
||||
await channel.send(embed=embed)
|
||||
|
||||
|
||||
async def setup(bot: commands.Bot):
|
||||
|
Reference in New Issue
Block a user