diff --git a/docs/source/_static/favicon.ico b/docs/source/_static/favicon.ico new file mode 100644 index 0000000..950a896 Binary files /dev/null and b/docs/source/_static/favicon.ico differ diff --git a/docs/source/conf.py b/docs/source/conf.py index c1b17ee..17654c1 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -58,6 +58,7 @@ html_css_files = [ 'custom.css', ] +html_favicon = '_static/favicon.ico' html_theme_options = { "icon_links": [ { @@ -65,6 +66,18 @@ "url": "https://github.com/ManagerX-Development/ManagerX", "icon": "fa-brands fa-square-github", "type": "fontawesome", + }, + { + "name": "Website", + "url": "https://managerx-bot.de", + "icon": "fa-solid fa-globe", + "type": "fontawesome", + }, + { + "name": "Instagram", + "url": "https://www.instagram.com/managerx_development", + "icon": "fa-brands fa-instagram", + "type": "fontawesome", } ], diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000..950a896 Binary files /dev/null and b/favicon.ico differ diff --git a/src/api/dashboard/routes.py b/src/api/dashboard/routes.py index 074c2b9..2742885 100644 --- a/src/api/dashboard/routes.py +++ b/src/api/dashboard/routes.py @@ -333,6 +333,31 @@ def calc_trend(today, yesterday): m_trend, m_trend_val = calc_trend(messages_today, messages_yesterday) j_trend, j_trend_val = calc_trend(joined_today, joined_yesterday) + # Calculate Server Age (NEU) + server_age_days = (today_dt - guild.created_at).days + server_age_str = f"{server_age_days}d" + + # Fetch Staff / User Role members (NEU) + staff_members_list = [] + user_members_list = [] + + if hasattr(bot_instance, 'settings_db') and hasattr(bot_instance.settings_db, 'get_guild_settings'): + guild_settings = bot_instance.settings_db.get_guild_settings(guild_id) + team_role_id = guild_settings.get("team_role_id") + user_role_id = guild_settings.get("user_role_id") + + if team_role_id: + team_role = guild.get_role(int(team_role_id)) + if team_role: + for m in team_role.members: + staff_members_list.append({"name": m.display_name, "id": str(m.id), "avatar": m.display_avatar.url}) + + if user_role_id: + user_role = guild.get_role(int(user_role_id)) + if user_role: + for m in user_role.members: + user_members_list.append({"name": m.display_name, "id": str(m.id), "avatar": m.display_avatar.url}) + # Prepare final stats object total_members = guild.member_count or len(guild.members) online_members = 0 @@ -350,7 +375,10 @@ def calc_trend(today, yesterday): "messages_today": messages_today, "messages_trend": m_trend, "messages_trend_value": m_trend_val, - "history": history + "history": history, + "server_age": server_age_str, + "staff_members": staff_members_list, + "user_members": user_members_list } return stats except Exception as e: diff --git a/src/api/dashboard/settings_routes.py b/src/api/dashboard/settings_routes.py index c7a086c..c89a02c 100644 --- a/src/api/dashboard/settings_routes.py +++ b/src/api/dashboard/settings_routes.py @@ -54,7 +54,8 @@ async def get_settings(guild_id: int): raise HTTPException(status_code=503, detail="Bot database not ready") try: - guild_lang = bot_instance.settings_db.get_guild_language(guild_id) if hasattr(bot_instance.settings_db, 'get_guild_language') else "de" + guild_settings = bot_instance.settings_db.get_guild_settings(guild_id) if hasattr(bot_instance.settings_db, 'get_guild_settings') else {} + guild_lang = guild_settings.get("language", "de") return { "success": True, @@ -63,7 +64,9 @@ async def get_settings(guild_id: int): "prefix": "!" , "auto_mod": True, "welcome_message": False, - "language": guild_lang + "language": guild_lang, + "user_role_id": str(guild_settings.get("user_role_id")) if guild_settings.get("user_role_id") else None, + "team_role_id": str(guild_settings.get("team_role_id")) if guild_settings.get("team_role_id") else None } } except Exception as e: @@ -80,7 +83,18 @@ async def update_settings(guild_id: int, request: Request, user: dict = Depends( data = await request.json() try: - # Update logic... + # Update logic + update_data = {} + if "language" in data: + update_data["language"] = data["language"] + if "user_role_id" in data: + update_data["user_role_id"] = int(data["user_role_id"]) if data["user_role_id"] else None + if "team_role_id" in data: + update_data["team_role_id"] = int(data["team_role_id"]) if data["team_role_id"] else None + + if update_data and hasattr(bot_instance.settings_db, 'update_guild_settings'): + bot_instance.settings_db.update_guild_settings(guild_id, **update_data) + user_name = user.get("username", "Unbekannter User") await send_dashboard_notification(guild_id, "Allgemein", user_name) return {"success": True, "message": "Settings updated"} diff --git a/src/web/components/OverviewSettings.tsx b/src/web/components/OverviewSettings.tsx index 43aa50f..b9094bb 100644 --- a/src/web/components/OverviewSettings.tsx +++ b/src/web/components/OverviewSettings.tsx @@ -146,11 +146,40 @@ export default function OverviewSettings({ guildId, initialStats, settings }: Ov

Nachrichten Volumen (7 Tage)

-
- - - - +
+
+ + +
+ +
+
+ Team & Community + + { (stats?.staff_members?.length || 0) + (stats?.user_members?.length || 0) } Members + +
+ +
+ {stats?.staff_members?.map((m: any) => ( +
+ + {m.name} + TEAM +
+ ))} + {stats?.user_members?.map((m: any) => ( +
+ + {m.name} + USER +
+ ))} + {(!stats?.staff_members?.length && !stats?.user_members?.length) && ( +

Keine Rollen definiert oder keine Mitglieder gefunden.

+ )} +
+
diff --git a/src/web/dashboard/SettingsPage.tsx b/src/web/dashboard/SettingsPage.tsx index b450711..4e72ac0 100644 --- a/src/web/dashboard/SettingsPage.tsx +++ b/src/web/dashboard/SettingsPage.tsx @@ -68,6 +68,8 @@ export default function SettingsPage() { const [welcomeMessage, setWelcomeMessage] = useState(false); const [theme, setTheme] = useState("dark"); const [language, setLanguage] = useState("de"); + const [userRoleId, setUserRoleId] = useState(null); + const [teamRoleId, setTeamRoleId] = useState(null); const [stats, setStats] = useState(null); @@ -94,6 +96,8 @@ export default function SettingsPage() { setAutoMod(settings.auto_mod ?? true); setWelcomeMessage(settings.welcome_message ?? false); setLanguage(settings.language || "de"); + setUserRoleId(settings.user_role_id || null); + setTeamRoleId(settings.team_role_id || null); // Set Guild Metadata setGuildData({ @@ -122,7 +126,7 @@ export default function SettingsPage() { const baseUrl = import.meta.env.VITE_API_URL || 'http://localhost:8040'; const apiUrl = `${baseUrl}/dashboard/settings/${guildId}`; - const payload = { prefix, autoMod, welcomeMessage, language }; + const payload = { prefix, autoMod, welcomeMessage, language, user_role_id: userRoleId, team_role_id: teamRoleId }; const res = await fetch(apiUrl, { method: "POST", @@ -294,6 +298,38 @@ export default function SettingsPage() { + +
+
+ + +

Mitglieder mit dieser Rolle werden als Staff im Dashboard angezeigt.

+
+ +
+ + +

Benutzer mit dieser Rolle werden im User-Quick-View angezeigt.

+
+