Skip to content

Commit 8bd7b6d

Browse files
committed
add a user export method
1 parent ffa13fc commit 8bd7b6d

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

cogs/admin.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
from utils.register import register
1717
from utils.role_management import RoleManagement
1818
from utils.server_settings import get_guild, update_guild
19+
from utils.users import get_users_csv
1920
from utils.voice_channel import create_voice_channel
2021
from utils.voice_channels import add_voice_channel
2122

@@ -84,6 +85,24 @@ async def username_autocomplete(
8485
for player in users.scalars()
8586
]
8687

88+
89+
@group.command(name="export", description="Export all registered users")
90+
@app_commands.guild_only()
91+
@app_commands.default_permissions(administrator=True)
92+
@app_commands.checks.has_permissions(administrator=True)
93+
async def export_registered_users(self, interaction: discord.Interaction) -> None:
94+
"""Export all registered users"""
95+
await interaction.response.defer()
96+
if interaction.guild is None:
97+
return # is already set to guild_only
98+
async with self.bot.db.create_session() as session:
99+
total, registered_users = await get_users_csv(session, interaction.guild_id)
100+
if total <= 0:
101+
await interaction.followup.send("There are currently no registered users", ephemeral=True)
102+
return
103+
await interaction.followup.send("Registered users:", ephemeral=True, file=registered_users)
104+
105+
87106
@group.command(name="unregister", description="Unregister a user")
88107
@app_commands.describe(username="EA username")
89108
@app_commands.guild_only()

utils/users.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import csv
2+
import io
3+
4+
import discord
5+
from sqlalchemy import select
6+
from sqlalchemy.ext.asyncio import AsyncSession
7+
8+
from database.dto.users import User
9+
10+
async def get_users_csv(session: AsyncSession, server_id: int) -> tuple[int, discord.File]:
11+
stmt = (
12+
select(User)
13+
.filter(User.server_id == server_id)
14+
)
15+
res = (await session.execute(stmt)).all()
16+
total = len(res)
17+
with io.StringIO() as data_stream:
18+
outcsv = csv.writer(data_stream)
19+
outcsv.writerow(User.__table__.columns.keys())
20+
for row in res:
21+
outcsv.writerow([row[0].server_id, row[0].discord_id, row[0].username, row[0].player_id, row[0].kdr_role_id, row[0].user_id, row[0].created_at, row[0].updated_at])
22+
data_stream.seek(0)
23+
return (total, discord.File(data_stream, filename="channel_names.csv"))

0 commit comments

Comments
 (0)