modified: templates/edit_giveaway.html

modified:   templates/edit_user.html
	modified:   templates/global_admin_dashboard.html
	modified:   templates/landing.html
	modified:   templates/login.html
	modified:   templates/logs.html
	modified:   templates/navigation.html
	modified:   templates/server_admin_dashboard.html
	modified:   templates/user_dashboard.html
	modified:   templates/user_giveaways.html
	new file:   templates/user_giveaways_old.html
	modified:   templates/user_landing_page.html
This commit is contained in:
SimolZimol
2025-08-18 23:49:22 +02:00
parent 916b5d5131
commit 61f824a8c5
12 changed files with 2870 additions and 325 deletions

View File

@@ -5,35 +5,241 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Edit Giveaway</title> <title>Edit Giveaway</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #0c1426 0%, #1a1f2e 25%, #2d3748 75%, #0c1426 100%);
min-height: 100vh;
color: #e2e8f0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.edit-container {
max-width: 800px;
margin: 2rem auto;
background: rgba(26, 31, 46, 0.8);
backdrop-filter: blur(15px);
border: 1px solid rgba(102, 126, 234, 0.2);
border-radius: 20px;
padding: 2rem;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
}
.edit-header {
text-align: center;
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 1px solid rgba(102, 126, 234, 0.1);
}
.edit-title {
color: #e2e8f0;
font-weight: 700;
font-size: 2rem;
margin-bottom: 0.5rem;
}
.edit-subtitle {
color: #a0aec0;
font-size: 1.1rem;
}
.form-group {
margin-bottom: 1.5rem;
}
.form-group label {
color: #e2e8f0;
font-weight: 600;
margin-bottom: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.form-control {
background: rgba(45, 55, 72, 0.8);
border: 1px solid rgba(102, 126, 234, 0.3);
border-radius: 10px;
color: #e2e8f0;
padding: 0.75rem 1rem;
transition: all 0.3s ease;
}
.form-control:focus {
background: rgba(45, 55, 72, 0.9);
border-color: #667eea;
box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25);
color: #e2e8f0;
}
.form-control::placeholder {
color: #a0aec0;
}
.form-check {
background: rgba(45, 55, 72, 0.6);
border: 1px solid rgba(102, 126, 234, 0.2);
border-radius: 10px;
padding: 1rem;
margin-bottom: 1.5rem;
}
.form-check-label {
color: #e2e8f0;
font-weight: 600;
margin-left: 0.5rem;
}
.form-check-input {
background-color: rgba(45, 55, 72, 0.8);
border-color: rgba(102, 126, 234, 0.5);
border-radius: 4px;
}
.form-check-input:checked {
background-color: #667eea;
border-color: #667eea;
}
.form-check-input:focus {
box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25);
}
.btn-container {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid rgba(102, 126, 234, 0.1);
}
.edit-btn {
padding: 0.75rem 2rem;
border-radius: 50px;
font-weight: 600;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
transition: all 0.3s ease;
border: none;
}
.edit-btn.primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
}
.edit-btn.primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
color: white;
text-decoration: none;
}
.edit-btn.secondary {
background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);
color: white;
box-shadow: 0 4px 15px rgba(74, 85, 104, 0.3);
}
.edit-btn.secondary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(74, 85, 104, 0.4);
color: white;
text-decoration: none;
}
.input-icon {
color: #667eea;
}
@media (max-width: 768px) {
.edit-container {
margin: 1rem;
padding: 1.5rem;
}
.edit-title {
font-size: 1.5rem;
}
.btn-container {
flex-direction: column;
}
.edit-btn {
justify-content: center;
}
}
</style>
</head> </head>
<body> <body>
{% include 'navigation.html' %} {% include 'navigation.html' %}
<div class="container mt-5"> <div class="container mt-5">
<h2>Edit Giveaway - {{ giveaway.name }}</h2> <div class="edit-container">
<form method="post"> <div class="edit-header">
<div class="form-group"> <h2 class="edit-title">
<label for="platform">Platform</label> <i class="fas fa-edit"></i> Edit Giveaway
<input type="text" class="form-control" id="platform" name="platform" value="{{ giveaway.platform }}" required> </h2>
<p class="edit-subtitle">{{ giveaway.name }}</p>
</div> </div>
<div class="form-group">
<label for="name">Name</label> <form method="post">
<input type="text" class="form-control" id="name" name="name" value="{{ giveaway.name }}" required> <div class="form-group">
</div> <label for="platform">
<div class="form-group"> <i class="fas fa-gamepad input-icon"></i> Platform
<label for="game_key">Game Key</label> </label>
<input type="text" class="form-control" id="game_key" name="game_key" value="{{ giveaway.game_key }}" required> <input type="text" class="form-control" id="platform" name="platform"
</div> value="{{ giveaway.platform }}" placeholder="Enter platform name" required>
<div class="form-group"> </div>
<label for="winner_dc_id">Winner Discord ID</label>
<input type="text" class="form-control" id="winner_dc_id" name="winner_dc_id" value="{{ giveaway.winner_dc_id }}"> <div class="form-group">
</div> <label for="name">
<div class="form-check"> <i class="fas fa-tag input-icon"></i> Giveaway Name
<input type="checkbox" class="form-check-input" id="aktiv" name="aktiv" {% if giveaway.aktiv %}checked{% endif %}> </label>
<label class="form-check-label" for="aktiv">Active</label> <input type="text" class="form-control" id="name" name="name"
</div> value="{{ giveaway.name }}" placeholder="Enter giveaway name" required>
<button type="submit" class="btn btn-primary mt-3">Save Changes</button> </div>
<a href="{{ url_for('server_admin_dashboard', guild_id=guild_id) }}" class="btn btn-secondary mt-3">Back to Dashboard</a>
</form> <div class="form-group">
<label for="game_key">
<i class="fas fa-key input-icon"></i> Game Key
</label>
<input type="text" class="form-control" id="game_key" name="game_key"
value="{{ giveaway.game_key }}" placeholder="Enter game key" required>
</div>
<div class="form-group">
<label for="winner_dc_id">
<i class="fas fa-crown input-icon"></i> Winner Discord ID
</label>
<input type="text" class="form-control" id="winner_dc_id" name="winner_dc_id"
value="{{ giveaway.winner_dc_id }}" placeholder="Enter winner's Discord ID (optional)">
</div>
<div class="form-check">
<input type="checkbox" class="form-check-input" id="aktiv" name="aktiv"
{% if giveaway.aktiv %}checked{% endif %}>
<label class="form-check-label" for="aktiv">
<i class="fas fa-check-circle"></i> Mark as Redeemed
</label>
</div>
<div class="btn-container">
<button type="submit" class="edit-btn primary">
<i class="fas fa-save"></i> Save Changes
</button>
<a href="{{ url_for('server_admin_dashboard', guild_id=guild_id) }}" class="edit-btn secondary">
<i class="fas fa-arrow-left"></i> Back to Dashboard
</a>
</div>
</form>
</div>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -5,47 +5,333 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Edit User</title> <title>Edit User</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #0c1426 0%, #1a1f2e 25%, #2d3748 75%, #0c1426 100%);
min-height: 100vh;
color: #e2e8f0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.edit-container {
max-width: 900px;
margin: 2rem auto;
background: rgba(26, 31, 46, 0.8);
backdrop-filter: blur(15px);
border: 1px solid rgba(102, 126, 234, 0.2);
border-radius: 20px;
padding: 2rem;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
}
.edit-header {
text-align: center;
margin-bottom: 2rem;
padding-bottom: 1rem;
border-bottom: 1px solid rgba(102, 126, 234, 0.1);
}
.edit-title {
color: #e2e8f0;
font-weight: 700;
font-size: 2rem;
margin-bottom: 0.5rem;
}
.edit-subtitle {
color: #a0aec0;
font-size: 1.1rem;
font-family: 'Courier New', monospace;
}
.form-row {
margin-bottom: 1rem;
}
.form-group {
margin-bottom: 1.5rem;
}
.form-group label {
color: #e2e8f0;
font-weight: 600;
margin-bottom: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.form-control {
background: rgba(45, 55, 72, 0.8);
border: 1px solid rgba(102, 126, 234, 0.3);
border-radius: 10px;
color: #e2e8f0;
padding: 0.75rem 1rem;
transition: all 0.3s ease;
}
.form-control:focus {
background: rgba(45, 55, 72, 0.9);
border-color: #667eea;
box-shadow: 0 0 0 0.2rem rgba(102, 126, 234, 0.25);
color: #e2e8f0;
}
.form-control::placeholder {
color: #a0aec0;
}
.form-section {
background: rgba(45, 55, 72, 0.4);
border: 1px solid rgba(102, 126, 234, 0.1);
border-radius: 15px;
padding: 1.5rem;
margin-bottom: 2rem;
}
.section-title {
color: #667eea;
font-weight: 600;
font-size: 1.1rem;
margin-bottom: 1rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.form-check {
background: rgba(45, 55, 72, 0.6);
border: 1px solid rgba(239, 68, 68, 0.3);
border-radius: 10px;
padding: 1rem;
margin-bottom: 1.5rem;
}
.form-check-label {
color: #e2e8f0;
font-weight: 600;
margin-left: 0.5rem;
display: flex;
align-items: center;
gap: 0.5rem;
}
.form-check-input {
background-color: rgba(45, 55, 72, 0.8);
border-color: rgba(239, 68, 68, 0.5);
border-radius: 4px;
}
.form-check-input:checked {
background-color: #ef4444;
border-color: #ef4444;
}
.form-check-input:focus {
box-shadow: 0 0 0 0.2rem rgba(239, 68, 68, 0.25);
}
.btn-container {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 2rem;
padding-top: 1rem;
border-top: 1px solid rgba(102, 126, 234, 0.1);
}
.edit-btn {
padding: 0.75rem 2rem;
border-radius: 50px;
font-weight: 600;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
transition: all 0.3s ease;
border: none;
}
.edit-btn.primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
}
.edit-btn.primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
color: white;
text-decoration: none;
}
.edit-btn.secondary {
background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);
color: white;
box-shadow: 0 4px 15px rgba(74, 85, 104, 0.3);
}
.edit-btn.secondary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(74, 85, 104, 0.4);
color: white;
text-decoration: none;
}
.input-icon {
color: #667eea;
}
.warning-icon {
color: #f59e0b;
}
.danger-icon {
color: #ef4444;
}
@media (max-width: 768px) {
.edit-container {
margin: 1rem;
padding: 1.5rem;
}
.edit-title {
font-size: 1.5rem;
}
.btn-container {
flex-direction: column;
}
.edit-btn {
justify-content: center;
}
}
</style>
</head> </head>
<body> <body>
{% include 'navigation.html' %} {% include 'navigation.html' %}
<div class="container mt-5"> <div class="container mt-5">
<h2>Edit User - {{ user_data.user_id }}</h2> <div class="edit-container">
<form method="post"> <div class="edit-header">
<div class="form-group"> <h2 class="edit-title">
<label for="points">Points</label> <i class="fas fa-user-edit"></i> Edit User
<input type="number" class="form-control" id="points" name="points" value="{{ user_data.points }}" required> </h2>
<p class="edit-subtitle">{{ user_data.user_id }}</p>
</div> </div>
<div class="form-group">
<label for="level">Level</label> <form method="post">
<input type="number" class="form-control" id="level" name="level" value="{{ user_data.level }}" required> <!-- Core Statistics Section -->
</div> <div class="form-section">
<div class="form-group"> <div class="section-title">
<label for="permission">Permission Level</label> <i class="fas fa-chart-bar"></i> Core Statistics
<input type="number" class="form-control" id="permission" name="permission" min="0" max="{{ max_permission }}" value="{{ user_data.permission }}" required> </div>
</div> <div class="form-row">
<div class="form-group"> <div class="col-md-6">
<label for="askmultus">AskMultus Executions</label> <div class="form-group">
<input type="number" class="form-control" id="askmultus" name="askmultus" value="{{ user_data.askmultus }}" required> <label for="points">
</div> <i class="fas fa-coins input-icon"></i> Points
<div class="form-group"> </label>
<label for="filter_value">Filter Value (e.g., Warnings)</label> <input type="number" class="form-control" id="points" name="points"
<input type="number" class="form-control" id="filter_value" name="filter_value" value="{{ user_data.filter_value }}" required> value="{{ user_data.points }}" min="0" placeholder="User points" required>
</div> </div>
<div class="form-group"> </div>
<label for="rank">Rank (for Minecraft Integration)</label> <div class="col-md-6">
<input type="text" class="form-control" id="rank" name="rank" value="{{ user_data.rank }}"> <div class="form-group">
</div> <label for="level">
<div class="form-group"> <i class="fas fa-layer-group input-icon"></i> Level
<label for="xp">XP</label> </label>
<input type="number" class="form-control" id="xp" name="xp" value="{{ user_data.xp }}" required> <input type="number" class="form-control" id="level" name="level"
</div> value="{{ user_data.level }}" min="1" placeholder="User level" required>
<div class="form-check"> </div>
<input type="checkbox" class="form-check-input" id="ban" name="ban" value="1" {% if user_data.ban %}checked{% endif %}> </div>
<label class="form-check-label" for="ban">Ban User</label> </div>
</div> <div class="form-group">
<button type="submit" class="btn btn-primary mt-3">Save Changes</button> <label for="xp">
<a href="{{ url_for('server_admin_dashboard', guild_id=guild_id) }}" class="btn btn-secondary mt-3">Back to Dashboard</a> <i class="fas fa-star input-icon"></i> Experience Points (XP)
</form> </label>
<input type="number" class="form-control" id="xp" name="xp"
value="{{ user_data.xp }}" min="0" placeholder="Experience points" required>
</div>
</div>
<!-- Permissions & Access Section -->
<div class="form-section">
<div class="section-title">
<i class="fas fa-shield-alt"></i> Permissions & Access
</div>
<div class="form-row">
<div class="col-md-6">
<div class="form-group">
<label for="permission">
<i class="fas fa-key input-icon"></i> Permission Level
</label>
<input type="number" class="form-control" id="permission" name="permission"
min="0" max="{{ max_permission }}" value="{{ user_data.permission }}"
placeholder="Permission level (0-{{ max_permission }})" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="askmultus">
<i class="fas fa-robot input-icon"></i> AskMultus Executions
</label>
<input type="number" class="form-control" id="askmultus" name="askmultus"
value="{{ user_data.askmultus }}" min="0" placeholder="AI query count" required>
</div>
</div>
</div>
</div>
<!-- Moderation & Integration Section -->
<div class="form-section">
<div class="section-title">
<i class="fas fa-cogs"></i> Moderation & Integration
</div>
<div class="form-row">
<div class="col-md-6">
<div class="form-group">
<label for="filter_value">
<i class="fas fa-exclamation-triangle warning-icon"></i> Filter Value (Warnings)
</label>
<input type="number" class="form-control" id="filter_value" name="filter_value"
value="{{ user_data.filter_value }}" min="0" placeholder="Warning count" required>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label for="rank">
<i class="fas fa-cube input-icon"></i> Minecraft Rank
</label>
<input type="text" class="form-control" id="rank" name="rank"
value="{{ user_data.rank }}" placeholder="Minecraft integration rank">
</div>
</div>
</div>
</div>
<!-- Danger Zone -->
<div class="form-check">
<input type="checkbox" class="form-check-input" id="ban" name="ban" value="1"
{% if user_data.ban %}checked{% endif %}>
<label class="form-check-label" for="ban">
<i class="fas fa-ban danger-icon"></i> Ban User from Bot Services
</label>
</div>
<div class="btn-container">
<button type="submit" class="edit-btn primary">
<i class="fas fa-save"></i> Save Changes
</button>
<a href="{{ url_for('server_admin_dashboard', guild_id=guild_id) }}" class="edit-btn secondary">
<i class="fas fa-arrow-left"></i> Back to Dashboard
</a>
</div>
</form>
</div>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -6,38 +6,270 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Global Admin Dashboard</title> <title>Global Admin Dashboard</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #e0e0e0;
}
.admin-navbar {
background: linear-gradient(135deg, #e53e3e 0%, #c53030 100%);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.navbar-brand {
font-weight: 700;
font-size: 1.5rem;
color: #f8f9fa !important;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.navbar-nav .nav-link {
color: #f8f9fa !important;
font-weight: 500;
transition: all 0.3s ease;
border-radius: 8px;
margin: 0 5px;
padding: 8px 16px !important;
}
.navbar-nav .nav-link:hover {
color: #ffffff !important;
background: rgba(255, 255, 255, 0.1);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.admin-container {
background: rgba(30, 30, 46, 0.95);
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 2rem;
margin-top: 2rem;
}
.admin-header {
text-align: center;
margin-bottom: 3rem;
}
.admin-title {
color: #f8f9fa;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.5);
}
.admin-subtitle {
color: #a0a0a0;
font-size: 1.2rem;
font-weight: 400;
}
.admin-card {
background: rgba(45, 55, 72, 0.8);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
margin-bottom: 2rem;
}
.admin-card:hover {
transform: translateY(-5px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.4);
}
.admin-card .card-body {
padding: 2rem;
}
.card-title {
color: #f7fafc;
font-weight: 600;
font-size: 1.5rem;
margin-bottom: 1.5rem;
}
.card-text {
color: #cbd5e0;
font-size: 1.1rem;
margin-bottom: 1.5rem;
}
.status-badge {
font-size: 1.1rem;
padding: 0.5rem 1rem;
border-radius: 25px;
font-weight: 600;
}
.badge-success-custom {
background: linear-gradient(135deg, #48bb78, #38a169);
color: white;
box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
}
.badge-danger-custom {
background: linear-gradient(135deg, #e53e3e, #c53030);
color: white;
box-shadow: 0 4px 12px rgba(229, 62, 62, 0.3);
}
.admin-button {
border-radius: 25px;
padding: 0.75rem 2rem;
font-weight: 600;
text-decoration: none;
display: block;
transition: all 0.3s ease;
margin-bottom: 1rem;
border: none;
text-align: center;
}
.btn-start {
background: linear-gradient(135deg, #48bb78, #38a169);
color: white;
box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
}
.btn-start:hover:not(.disabled) {
background: linear-gradient(135deg, #38a169, #2f855a);
color: white;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(72, 187, 120, 0.4);
}
.btn-stop {
background: linear-gradient(135deg, #e53e3e, #c53030);
color: white;
box-shadow: 0 4px 12px rgba(229, 62, 62, 0.3);
}
.btn-stop:hover:not(.disabled) {
background: linear-gradient(135deg, #c53030, #9c2626);
color: white;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(229, 62, 62, 0.4);
}
.btn-logs {
background: linear-gradient(135deg, #ffa500, #ff8c00);
color: white;
box-shadow: 0 4px 12px rgba(255, 165, 0, 0.3);
}
.btn-logs:hover {
background: linear-gradient(135deg, #ff8c00, #ff7700);
color: white;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(255, 165, 0, 0.4);
}
.disabled {
opacity: 0.5;
cursor: not-allowed;
pointer-events: none;
}
.crown-icon {
color: #ffd700;
margin-right: 0.5rem;
font-size: 1.2rem;
}
/* Responsive Design */
@media (max-width: 768px) {
.admin-title {
font-size: 2rem;
}
.admin-container {
padding: 1rem;
margin-top: 1rem;
}
.admin-card .card-body {
padding: 1.5rem;
}
}
</style>
</head> </head>
<body> <body>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <nav class="navbar navbar-expand-lg navbar-dark admin-navbar">
<a class="navbar-brand" href="#">Multus Bot - Global Admin Dashboard</a> <a class="navbar-brand" href="#">
<i class="fas fa-crown crown-icon"></i>Multus Bot - Global Admin Dashboard
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav"> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ml-auto"> <ul class="navbar-nav ml-auto">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('user_landing_page') }}">Switch to User View</a> <a class="nav-link" href="{{ url_for('user_landing_page') }}">
<i class="fas fa-user"></i> Switch to User View
</a>
</li> </li>
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('logout') }}">Logout</a> <a class="nav-link" href="{{ url_for('logout') }}">
<i class="fas fa-sign-out-alt"></i> Logout
</a>
</li> </li>
</ul> </ul>
</div> </div>
</nav> </nav>
<div class="container mt-5"> <div class="container-fluid">
<h1 class="text-center">Welcome, {{ g.user_info['username'] }} (Admin)</h1> <div class="row justify-content-center">
<p class="text-center">Manage global bot settings and controls.</p> <div class="col-lg-8 col-xl-6">
<div class="admin-container">
<div class="admin-header">
<h1 class="admin-title">
<i class="fas fa-crown crown-icon"></i>Welcome, {{ g.user_info['username'] }}
</h1>
<p class="admin-subtitle">Global Administrator Dashboard - Manage bot settings and controls</p>
</div>
<div class="card mt-4"> <div class="admin-card">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Bot Status</h5> <h5 class="card-title">
<p class="card-text">Status: <i class="fas fa-robot"></i> Bot Status & Control
<span class="badge badge-{{ 'success' if g.bot_running else 'danger' }}"> </h5>
{{ "Running" if g.bot_running else "Stopped" }} <p class="card-text">
</span> Current Status:
</p> <span class="status-badge {{ 'badge-success-custom' if g.bot_running else 'badge-danger-custom' }}">
<a href="{{ url_for('start') }}" class="btn btn-primary btn-block {{ 'disabled' if g.bot_running else '' }}">Start Bot</a> <i class="fas fa-{{ 'play' if g.bot_running else 'stop' }}"></i>
<a href="{{ url_for('stop') }}" class="btn btn-danger btn-block {{ 'disabled' if not g.bot_running else '' }}">Stop Bot</a> {{ "Running" if g.bot_running else "Stopped" }}
<a href="{{ url_for('view_logs') }}" class="btn btn-warning btn-block">View Logs</a> </span>
</p>
<a href="{{ url_for('start') }}" class="admin-button btn-start {{ 'disabled' if g.bot_running else '' }}">
<i class="fas fa-play"></i> Start Bot
</a>
<a href="{{ url_for('stop') }}" class="admin-button btn-stop {{ 'disabled' if not g.bot_running else '' }}">
<i class="fas fa-stop"></i> Stop Bot
</a>
<a href="{{ url_for('view_logs') }}" class="admin-button btn-logs">
<i class="fas fa-file-alt"></i> View Logs
</a>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -5,97 +5,325 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Welcome to Multus Bot</title> <title>Welcome to Multus Bot</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style> <style>
body { body {
background-color: #f7f7f7; background: linear-gradient(135deg, #0c1426 0%, #1a1f2e 25%, #2d3748 75%, #0c1426 100%);
min-height: 100vh;
color: #e2e8f0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
} }
.hero { .hero {
background-image: url('https://source.unsplash.com/1600x900/?technology,ai'); background: linear-gradient(135deg, rgba(12, 20, 38, 0.9) 0%, rgba(26, 31, 46, 0.8) 50%, rgba(45, 55, 72, 0.9) 100%),
url('https://source.unsplash.com/1600x900/?technology,ai,dark');
background-size: cover; background-size: cover;
color: white; background-position: center;
padding: 100px 0; color: #ffffff;
padding: 120px 0;
text-align: center; text-align: center;
position: relative; position: relative;
overflow: hidden;
} }
.hero-overlay {
.hero::before {
content: '';
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
right: 0; right: 0;
bottom: 0; bottom: 0;
background: rgba(0, 0, 0, 0.5); background: linear-gradient(45deg, rgba(76, 81, 191, 0.3) 0%, rgba(139, 92, 246, 0.2) 100%);
animation: gradientShift 8s ease-in-out infinite alternate;
} }
@keyframes gradientShift {
0% { opacity: 0.3; }
100% { opacity: 0.6; }
}
.hero-content { .hero-content {
position: relative; position: relative;
z-index: 2; z-index: 2;
} }
.feature-section {
padding: 50px 0; .hero h1 {
font-size: 3.5rem;
font-weight: 700;
margin-bottom: 1.5rem;
text-shadow: 2px 2px 20px rgba(0, 0, 0, 0.7);
animation: float 6s ease-in-out infinite;
} }
.footer {
background-color: #343a40; @keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-10px); }
}
.hero .lead {
font-size: 1.4rem;
margin-bottom: 2rem;
text-shadow: 1px 1px 10px rgba(0, 0, 0, 0.5);
}
.hero-btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: none;
padding: 1rem 2.5rem;
font-size: 1.1rem;
font-weight: 600;
border-radius: 50px;
color: white; color: white;
padding: 20px 0; text-decoration: none;
display: inline-block;
transition: all 0.3s ease;
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3);
position: relative;
overflow: hidden;
}
.hero-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left 0.5s;
}
.hero-btn:hover::before {
left: 100%;
}
.hero-btn:hover {
transform: translateY(-3px);
box-shadow: 0 12px 35px rgba(102, 126, 234, 0.4);
color: white;
text-decoration: none;
}
.feature-section {
padding: 80px 0;
background: rgba(26, 31, 46, 0.6);
backdrop-filter: blur(10px);
border-radius: 20px;
margin: 2rem 0;
}
.feature-card {
background: rgba(45, 55, 72, 0.7);
backdrop-filter: blur(10px);
border: 1px solid rgba(102, 126, 234, 0.2);
border-radius: 20px;
padding: 2rem;
margin-bottom: 2rem;
text-align: center; text-align: center;
transition: all 0.3s ease;
position: relative;
overflow: hidden;
}
.feature-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
height: 4px;
background: linear-gradient(90deg, #667eea, #764ba2);
transform: scaleX(0);
transition: transform 0.3s ease;
}
.feature-card:hover::before {
transform: scaleX(1);
}
.feature-card:hover {
transform: translateY(-10px);
border-color: rgba(102, 126, 234, 0.5);
box-shadow: 0 15px 40px rgba(102, 126, 234, 0.2);
}
.feature-icon {
width: 80px;
height: 80px;
border-radius: 50%;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 1.5rem auto;
font-size: 2rem;
color: white;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.05); }
}
.feature-card h3 {
color: #e2e8f0;
font-weight: 600;
margin-bottom: 1rem;
}
.feature-card p {
color: #a0aec0;
line-height: 1.6;
}
.info-section {
background: rgba(12, 20, 38, 0.8);
backdrop-filter: blur(15px);
border-radius: 20px;
padding: 4rem 0;
margin: 2rem 0;
border: 1px solid rgba(102, 126, 234, 0.1);
}
.info-section h2 {
color: #e2e8f0;
font-weight: 700;
margin-bottom: 1.5rem;
}
.info-section .lead {
color: #a0aec0;
font-size: 1.2rem;
margin-bottom: 1rem;
}
.contact-section {
background: linear-gradient(135deg, rgba(26, 31, 46, 0.9) 0%, rgba(45, 55, 72, 0.8) 100%);
backdrop-filter: blur(15px);
border-radius: 20px;
padding: 4rem 0;
border: 1px solid rgba(102, 126, 234, 0.2);
}
.contact-btn {
background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);
border: none;
padding: 0.8rem 2rem;
border-radius: 50px;
color: white;
text-decoration: none;
display: inline-block;
transition: all 0.3s ease;
font-weight: 600;
}
.contact-btn:hover {
transform: translateY(-2px);
box-shadow: 0 10px 25px rgba(118, 75, 162, 0.3);
color: white;
text-decoration: none;
}
.footer {
background: linear-gradient(135deg, #0c1426 0%, #1a1f2e 100%);
color: #a0aec0;
padding: 2rem 0;
text-align: center;
border-top: 1px solid rgba(102, 126, 234, 0.1);
margin-top: 2rem;
}
.container {
position: relative;
z-index: 1;
}
@media (max-width: 768px) {
.hero h1 {
font-size: 2.5rem;
}
.hero .lead {
font-size: 1.1rem;
}
.feature-section {
padding: 3rem 0;
}
} }
</style> </style>
</head> </head>
<body> <body>
{% include 'navbar.html' %} {% include 'navbar.html' %}
<section class="hero"> <section class="hero">
<div class="hero-overlay"></div>
<div class="container hero-content"> <div class="container hero-content">
<h1 class="display-4">Welcome to Multus Bot</h1> <h1 class="display-4">
<i class="fas fa-robot"></i> Welcome to Multus Bot
</h1>
<p class="lead">The AI-powered Discord bot that helps manage your server with advanced tools and intelligent automation.</p> <p class="lead">The AI-powered Discord bot that helps manage your server with advanced tools and intelligent automation.</p>
<a href="{{ url_for('login') }}" class="btn btn-primary btn-lg">Get Started</a> <a href="{{ url_for('login') }}" class="hero-btn">
<i class="fas fa-rocket"></i> Get Started
</a>
</div> </div>
</section> </section>
<section class="feature-section"> <div class="container">
<div class="container"> <section class="feature-section">
<div class="row text-center"> <div class="row">
<div class="col-md-4"> <div class="col-md-4">
<img src="https://source.unsplash.com/100x100/?automation,robot" alt="Automation" class="img-fluid mb-3"> <div class="feature-card">
<h3>Advanced AI Automation</h3> <div class="feature-icon">
<p>Multus Bot automates repetitive tasks and manages your server effortlessly, so you can focus on what matters most.</p> <i class="fas fa-magic"></i>
</div>
<h3>Advanced AI Automation</h3>
<p>Multus Bot automates repetitive tasks and manages your server effortlessly, so you can focus on what matters most.</p>
</div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<img src="https://source.unsplash.com/100x100/?chat,bot" alt="Chat Assistance" class="img-fluid mb-3"> <div class="feature-card">
<h3>Smart Chat Assistance</h3> <div class="feature-icon">
<p>Using powerful AI, Multus Bot can assist with chat moderation, user queries, and provide useful information.</p> <i class="fas fa-comments"></i>
</div>
<h3>Smart Chat Assistance</h3>
<p>Using powerful AI, Multus Bot can assist with chat moderation, user queries, and provide useful information.</p>
</div>
</div> </div>
<div class="col-md-4"> <div class="col-md-4">
<img src="https://source.unsplash.com/100x100/?data,analytics" alt="Server Analytics" class="img-fluid mb-3"> <div class="feature-card">
<h3>Detailed Server Insights</h3> <div class="feature-icon">
<p>Gain access to detailed analytics and user engagement metrics to keep your server thriving and well-managed.</p> <i class="fas fa-chart-line"></i>
</div>
<h3>Detailed Server Insights</h3>
<p>Gain access to detailed analytics and user engagement metrics to keep your server thriving and well-managed.</p>
</div>
</div> </div>
</div> </div>
</div> </section>
</section>
<section class="bg-light py-5"> <section class="info-section">
<div class="container">
<div class="text-center"> <div class="text-center">
<h2>Exclusively Available on Ludi et Historia</h2> <h2><i class="fas fa-crown"></i> Exclusively Available on Ludi et Historia</h2>
<p class="lead">Currently, Multus Bot is available only for the <strong>Ludi et Historia</strong> Discord server. We are working to bring it to more communities soon.</p> <p class="lead">Currently, Multus Bot is available only for the <strong>Ludi et Historia</strong> Discord server. We are working to bring it to more communities soon.</p>
<p>If you're part of Ludi et Historia, start using Multus Bot now!</p> <p style="color: #a0aec0;">If you're part of Ludi et Historia, start using Multus Bot now!</p>
</div> </div>
</div> </section>
</section>
<section class="bg-dark text-white py-5"> <section class="contact-section">
<div class="container text-center"> <div class="text-center">
<h2>Need Assistance?</h2> <h2><i class="fas fa-question-circle"></i> Need Assistance?</h2>
<p>For any help or questions, reach out to <strong>@simolzimol</strong> on Discord. We're here to help!</p> <p style="color: #a0aec0; margin-bottom: 2rem;">For any help or questions, reach out to <strong>@simolzimol</strong> on Discord. We're here to help!</p>
<a href="https://discordapp.com/users/@simolzimol" class="btn btn-light">Contact SimolZimol</a> <a href="https://discordapp.com/users/@simolzimol" class="contact-btn">
</div> <i class="fab fa-discord"></i> Contact SimolZimol
</section> </a>
</div>
</section>
</div>
<footer class="footer"> <footer class="footer">
<div class="container"> <div class="container">
<p>&copy; 2024 Multus Bot | Built by SimolZimol | Exclusively on Ludi et Historia</p> <p><i class="fas fa-code"></i> &copy; 2024 Multus Bot | Built by SimolZimol | Exclusively on Ludi et Historia</p>
</div> </div>
</footer> </footer>

View File

@@ -3,19 +3,279 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Login</title> <title>Login - Multus Bot</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #0c1426 0%, #1a1f2e 25%, #2d3748 75%, #0c1426 100%);
min-height: 100vh;
color: #e2e8f0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
display: flex;
align-items: center;
justify-content: center;
overflow: hidden;
position: relative;
}
body::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: radial-gradient(circle at 20% 80%, rgba(102, 126, 234, 0.1) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(139, 92, 246, 0.1) 0%, transparent 50%);
animation: gradientFloat 8s ease-in-out infinite alternate;
}
@keyframes gradientFloat {
0% { opacity: 0.3; }
100% { opacity: 0.6; }
}
.login-container {
background: rgba(26, 31, 46, 0.8);
backdrop-filter: blur(20px);
border: 1px solid rgba(102, 126, 234, 0.2);
border-radius: 30px;
padding: 4rem;
text-align: center;
box-shadow: 0 30px 60px rgba(0, 0, 0, 0.4);
position: relative;
z-index: 1;
max-width: 500px;
width: 90%;
animation: slideUp 0.8s ease-out;
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.login-logo {
width: 80px;
height: 80px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 2rem auto;
font-size: 2.5rem;
color: white;
animation: pulse 2s infinite;
position: relative;
overflow: hidden;
}
.login-logo::before {
content: '';
position: absolute;
top: -50%;
left: -50%;
width: 200%;
height: 200%;
background: linear-gradient(45deg, transparent, rgba(255, 255, 255, 0.1), transparent);
animation: shine 3s linear infinite;
}
@keyframes shine {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes pulse {
0%, 100% { transform: scale(1); }
50% { transform: scale(1.05); }
}
.login-title {
color: #e2e8f0;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 20px rgba(0, 0, 0, 0.5);
}
.login-subtitle {
color: #a0aec0;
font-size: 1.1rem;
margin-bottom: 3rem;
line-height: 1.6;
}
.discord-btn {
background: linear-gradient(135deg, #5865f2 0%, #4752c4 100%);
border: none;
padding: 1rem 2.5rem;
border-radius: 50px;
color: white;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 1rem;
font-size: 1.1rem;
font-weight: 600;
transition: all 0.3s ease;
box-shadow: 0 10px 30px rgba(88, 101, 242, 0.3);
position: relative;
overflow: hidden;
}
.discord-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left 0.5s;
}
.discord-btn:hover::before {
left: 100%;
}
.discord-btn:hover {
transform: translateY(-3px);
box-shadow: 0 15px 40px rgba(88, 101, 242, 0.4);
color: white;
text-decoration: none;
}
.discord-logo {
width: 24px;
height: 24px;
filter: brightness(0) invert(1);
}
.features-list {
margin-top: 2rem;
text-align: left;
color: #a0aec0;
font-size: 0.95rem;
}
.feature-item {
display: flex;
align-items: center;
gap: 0.75rem;
margin-bottom: 0.75rem;
}
.feature-icon {
color: #667eea;
font-size: 1rem;
}
.decorative-elements {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
overflow: hidden;
}
.decorative-circle {
position: absolute;
border: 1px solid rgba(102, 126, 234, 0.1);
border-radius: 50%;
animation: float 6s ease-in-out infinite;
}
.decorative-circle:nth-child(1) {
width: 100px;
height: 100px;
top: 10%;
left: 10%;
animation-delay: 0s;
}
.decorative-circle:nth-child(2) {
width: 150px;
height: 150px;
top: 60%;
right: 15%;
animation-delay: 2s;
}
.decorative-circle:nth-child(3) {
width: 80px;
height: 80px;
bottom: 20%;
left: 20%;
animation-delay: 4s;
}
@keyframes float {
0%, 100% { transform: translateY(0px) rotate(0deg); }
50% { transform: translateY(-20px) rotate(180deg); }
}
@media (max-width: 768px) {
.login-container {
padding: 2.5rem 2rem;
}
.login-title {
font-size: 2rem;
}
.discord-btn {
padding: 0.875rem 2rem;
font-size: 1rem;
}
}
</style>
</head> </head>
<body> <body>
<div class="container mt-5"> <div class="decorative-elements">
<h1 class="text-center">Login with Discord</h1> <div class="decorative-circle"></div>
<div class="text-center mt-4"> <div class="decorative-circle"></div>
<a href="{{ url_for('login') }}" class="btn btn-primary"> <div class="decorative-circle"></div>
<img src="https://discord.com/assets/847541504914fd33810e70a0ea73177e.svg" width="20" alt="Discord Logo"> </div>
Login with Discord
</a> <div class="login-container">
<div class="login-logo">
<i class="fas fa-robot"></i>
</div>
<h1 class="login-title">Welcome to Multus</h1>
<p class="login-subtitle">Connect with Discord to access your AI-powered bot dashboard and start managing your server with intelligent automation.</p>
<a href="{{ url_for('login') }}" class="discord-btn">
<img src="https://discord.com/assets/847541504914fd33810e70a0ea73177e.svg" class="discord-logo" alt="Discord Logo">
Login with Discord
</a>
<div class="features-list">
<div class="feature-item">
<i class="fas fa-check feature-icon"></i>
<span>Secure Discord OAuth authentication</span>
</div>
<div class="feature-item">
<i class="fas fa-shield-alt feature-icon"></i>
<span>Protected bot management</span>
</div>
<div class="feature-item">
<i class="fas fa-chart-line feature-icon"></i>
<span>Server analytics and insights</span>
</div>
</div> </div>
</div> </div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js"></script>
</body> </body>

View File

@@ -6,32 +6,259 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Bot Logs</title> <title>Bot Logs</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #0c1426 0%, #1a1f2e 25%, #2d3748 75%, #0c1426 100%);
min-height: 100vh;
color: #e2e8f0;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
}
.container {
max-width: 1200px;
}
.logs-header {
text-align: center;
margin-bottom: 2rem;
padding: 2rem 0;
}
.logs-title {
color: #e2e8f0;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5);
}
.logs-subtitle {
color: #a0aec0;
font-size: 1.1rem;
}
.logs-container {
background: rgba(26, 31, 46, 0.8);
backdrop-filter: blur(15px);
border: 1px solid rgba(102, 126, 234, 0.2);
border-radius: 20px;
overflow: hidden;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
}
.logs-header-controls {
background: rgba(45, 55, 72, 0.6);
padding: 1.5rem;
border-bottom: 1px solid rgba(102, 126, 234, 0.1);
display: flex;
gap: 1rem;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
}
.logs-btn {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border: none;
padding: 0.75rem 1.5rem;
border-radius: 50px;
color: white;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-weight: 600;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(102, 126, 234, 0.3);
}
.logs-btn:hover {
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(102, 126, 234, 0.4);
color: white;
text-decoration: none;
}
.logs-btn.secondary {
background: linear-gradient(135deg, #4a5568 0%, #2d3748 100%);
box-shadow: 0 4px 15px rgba(74, 85, 104, 0.3);
}
.logs-btn.secondary:hover {
box-shadow: 0 8px 25px rgba(74, 85, 104, 0.4);
}
.logs-btn.back-btn {
background: linear-gradient(135deg, #38b2ac 0%, #319795 100%);
box-shadow: 0 4px 15px rgba(56, 178, 172, 0.3);
}
.logs-btn.back-btn:hover {
box-shadow: 0 8px 25px rgba(56, 178, 172, 0.4);
}
.log-content {
height: 500px;
overflow-y: auto;
background: rgba(12, 20, 38, 0.9);
color: #e2e8f0;
padding: 1.5rem;
font-family: 'Courier New', monospace;
font-size: 0.9rem;
line-height: 1.4;
border: none;
white-space: pre-wrap;
word-wrap: break-word;
scrollbar-width: thin;
scrollbar-color: #667eea rgba(26, 31, 46, 0.5);
}
.log-content::-webkit-scrollbar {
width: 8px;
}
.log-content::-webkit-scrollbar-track {
background: rgba(26, 31, 46, 0.5);
border-radius: 4px;
}
.log-content::-webkit-scrollbar-thumb {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
border-radius: 4px;
}
.log-content::-webkit-scrollbar-thumb:hover {
background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);
}
.loading-spinner {
display: none;
text-align: center;
padding: 2rem;
color: #a0aec0;
}
.loading-spinner i {
font-size: 2rem;
animation: spin 1s linear infinite;
}
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.status-indicator {
display: inline-flex;
align-items: center;
gap: 0.5rem;
color: #a0aec0;
font-size: 0.9rem;
}
.status-dot {
width: 8px;
height: 8px;
border-radius: 50%;
background: #48bb78;
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
@media (max-width: 768px) {
.logs-header-controls {
flex-direction: column;
text-align: center;
}
.logs-title {
font-size: 2rem;
}
.log-content {
height: 400px;
font-size: 0.8rem;
}
}
</style>
</head> </head>
<body> <body>
<div class="container mt-5"> <div class="container mt-5">
<h1 class="text-center">Bot Logs</h1> <div class="logs-header">
<div class="card mt-4"> <h1 class="logs-title">
<div class="card-body"> <i class="fas fa-file-alt"></i> Bot Logs
<button class="btn btn-primary mb-3" onclick="refreshLogs()">Refresh Logs</button> </h1>
<a href="{{ url_for('download_logs') }}" class="btn btn-secondary mb-3">Download Logs</a> <p class="logs-subtitle">Real-time bot activity and system logs</p>
<pre id="log-content" </div>
style="height: 500px; overflow-y: scroll; background-color: #f8f9fa; padding: 10px; border: 1px solid #ddd;"></pre>
<a href="{{ url_for('admin_dashboard') }}" class="btn btn-secondary btn-block mt-3">Back to Dashboard</a> <div class="logs-container">
<div class="logs-header-controls">
<div class="d-flex gap-2 flex-wrap">
<button class="logs-btn" onclick="refreshLogs()">
<i class="fas fa-sync-alt"></i> Refresh Logs
</button>
<a href="{{ url_for('download_logs') }}" class="logs-btn secondary">
<i class="fas fa-download"></i> Download Logs
</a>
</div>
<div class="status-indicator">
<div class="status-dot"></div>
<span>Live monitoring active</span>
</div>
</div>
<div class="loading-spinner" id="loading-spinner">
<i class="fas fa-spinner"></i>
<p>Loading logs...</p>
</div>
<pre id="log-content" class="log-content"></pre>
<div style="padding: 1.5rem; text-align: center; border-top: 1px solid rgba(102, 126, 234, 0.1);">
<a href="{{ url_for('admin_dashboard') }}" class="logs-btn back-btn">
<i class="fas fa-arrow-left"></i> Back to Dashboard
</a>
</div> </div>
</div> </div>
</div> </div>
<script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script> <script src="https://code.jquery.com/jquery-3.5.1.slim.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.5.2/dist/js/bootstrap.bundle.min.js"></script>
<script> <script>
function refreshLogs() { function refreshLogs() {
const spinner = document.getElementById("loading-spinner");
const logContent = document.getElementById("log-content");
spinner.style.display = "block";
logContent.style.display = "none";
fetch('{{ url_for("get_logs") }}') fetch('{{ url_for("get_logs") }}')
.then(response => response.json()) .then(response => response.json())
.then(data => { .then(data => {
document.getElementById("log-content").textContent = data.logs; logContent.textContent = data.logs;
spinner.style.display = "none";
logContent.style.display = "block";
// Auto-scroll to bottom
logContent.scrollTop = logContent.scrollHeight;
})
.catch(error => {
console.error('Error fetching logs:', error);
logContent.textContent = 'Error loading logs. Please try again.';
spinner.style.display = "none";
logContent.style.display = "block";
}); });
} }
// Auto-refresh logs every 30 seconds
setInterval(refreshLogs, 30000);
window.onload = refreshLogs; window.onload = refreshLogs;
</script> </script>
</body> </body>

View File

@@ -1,18 +1,69 @@
<nav class="navbar navbar-expand-lg navbar-dark bg-dark"> <style>
<a class="navbar-brand" href="/">Multus Bot</a> .navbar-dark-custom {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%);
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
}
.navbar-brand {
font-weight: 700;
font-size: 1.5rem;
color: #f8f9fa !important;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
}
.navbar-nav .nav-link {
color: #e0e0e0 !important;
font-weight: 500;
transition: all 0.3s ease;
border-radius: 8px;
margin: 0 5px;
padding: 8px 16px !important;
}
.navbar-nav .nav-link:hover {
color: #ffffff !important;
background: rgba(255, 255, 255, 0.1);
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.navbar-toggler {
border-color: rgba(255, 255, 255, 0.2);
}
.navbar-toggler-icon {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.8%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e");
}
</style>
<nav class="navbar navbar-expand-lg navbar-dark navbar-dark-custom">
<a class="navbar-brand" href="/">
<i class="fas fa-robot"></i> Multus Bot
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNav" aria-controls="navbarNav" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarNav"> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav ml-auto"> <ul class="navbar-nav ml-auto">
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('user_landing_page') }}">Server Selection</a> <a class="nav-link" href="{{ url_for('user_landing_page') }}">
<i class="fas fa-server"></i> Server Selection
</a>
</li> </li>
<!-- Admin Link nur für Bot-Admins anzeigen --> <!-- Admin Link nur für Bot-Admins anzeigen -->
{% if g.is_admin %} {% if g.is_admin %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('global_admin_dashboard') }}">Admin Dashboard</a> <a class="nav-link" href="{{ url_for('global_admin_dashboard') }}">
<i class="fas fa-crown"></i> Admin Dashboard
</a>
</li> </li>
{% endif %} {% endif %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link" href="{{ url_for('logout') }}">Logout</a> <a class="nav-link" href="{{ url_for('logout') }}">
<i class="fas fa-sign-out-alt"></i> Logout
</a>
</li> </li>
</ul> </ul>
</div> </div>

View File

@@ -5,100 +5,324 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Server Admin Dashboard</title> <title>Server Admin Dashboard</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style> <style>
.scrollable-table { body {
max-height: 400px; background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
overflow-y: auto; min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #e0e0e0;
} }
.admin-container {
background: rgba(30, 30, 46, 0.95);
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 2rem;
margin-top: 2rem;
}
.admin-header {
text-align: center;
margin-bottom: 3rem;
}
.admin-title {
color: #f8f9fa;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.5);
}
.admin-subtitle {
color: #a0a0a0;
font-size: 1.2rem;
font-weight: 400;
}
.admin-card {
background: rgba(45, 55, 72, 0.8);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
margin-bottom: 2rem;
}
.admin-card:hover {
transform: translateY(-5px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.4);
}
.admin-card .card-body {
padding: 2rem;
}
.card-title {
color: #f7fafc;
font-weight: 600;
font-size: 1.5rem;
margin-bottom: 1rem;
}
.card-text {
color: #cbd5e0;
font-size: 1rem;
margin-bottom: 1.5rem;
}
.scrollable-table {
max-height: 500px;
overflow-y: auto;
border-radius: 10px;
background: rgba(40, 40, 56, 0.9);
}
.table {
margin-bottom: 0;
color: #e0e0e0;
}
.table thead th {
background: linear-gradient(135deg, #2d3748 0%, #1a202c 100%);
color: #f7fafc;
border: none;
padding: 1rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
font-size: 0.9rem;
position: sticky;
top: 0;
z-index: 10;
}
.table tbody tr {
background: rgba(45, 55, 72, 0.6);
transition: all 0.3s ease;
border: none;
}
.table tbody tr:hover {
background: rgba(74, 85, 104, 0.8);
transform: translateY(-1px);
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
}
.table tbody td {
padding: 1rem;
vertical-align: middle;
border: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
color: #e0e0e0;
}
.status-badge { .status-badge {
font-size: 0.9rem; font-size: 0.9rem;
padding: 0.5em; padding: 0.5rem 1rem;
border-radius: 5px; border-radius: 25px;
font-weight: 600;
}
.badge-success-custom {
background: linear-gradient(135deg, #48bb78, #38a169);
color: white;
box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
}
.badge-warning-custom {
background: linear-gradient(135deg, #ffa500, #ff8c00);
color: white;
box-shadow: 0 4px 12px rgba(255, 165, 0, 0.3);
}
.badge-danger-custom {
background: linear-gradient(135deg, #e53e3e, #c53030);
color: white;
box-shadow: 0 4px 12px rgba(229, 62, 62, 0.3);
}
.admin-btn {
background: linear-gradient(135deg, #4299e1, #3182ce);
border: none;
border-radius: 20px;
padding: 0.5rem 1rem;
color: #ffffff;
font-weight: 600;
text-decoration: none;
font-size: 0.85rem;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(66, 153, 225, 0.3);
}
.admin-btn:hover {
background: linear-gradient(135deg, #3182ce, #2c5282);
color: #ffffff;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 6px 16px rgba(66, 153, 225, 0.4);
}
.section-icon {
font-size: 1.3rem;
margin-right: 0.5rem;
}
.giveaway-icon { color: #ffd700; }
.user-icon { color: #4299e1; }
/* Responsive Design */
@media (max-width: 768px) {
.admin-title {
font-size: 2rem;
}
.admin-container {
padding: 1rem;
margin-top: 1rem;
}
.table thead th,
.table tbody td {
padding: 0.75rem 0.5rem;
font-size: 0.9rem;
}
.scrollable-table {
max-height: 400px;
}
} }
</style> </style>
</head> </head>
<body> <body>
{% include 'navigation.html' %} {% include 'navigation.html' %}
<div class="container mt-5"> <div class="container-fluid">
<h1 class="text-center">Server Admin Dashboard for {{ guild_name }}</h1> <div class="row justify-content-center">
<p class="text-center text-muted">Manage server-specific settings and data for server <strong>{{ guild_id }}</strong>.</p> <div class="col-lg-12 col-xl-10">
<div class="admin-container">
<div class="admin-header">
<h1 class="admin-title">
<i class="fas fa-cogs"></i> Server Admin Dashboard
</h1>
<p class="admin-subtitle">{{ guild_name }} • Manage server settings and data</p>
</div>
<!-- Giveaway Management Section --> <!-- Giveaway Management Section -->
<div class="card mt-4"> <div class="admin-card">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">Giveaway Management</h5> <h5 class="card-title">
<p class="card-text">View and manage all active giveaways for this server.</p> <i class="fas fa-gift section-icon giveaway-icon"></i>Giveaway Management
<div class="table-responsive scrollable-table"> </h5>
<table class="table table-bordered"> <p class="card-text">View and manage all active giveaways for this server.</p>
<thead> <div class="table-responsive scrollable-table">
<tr> <table class="table">
<th>Name</th> <thead>
<th>Platform</th> <tr>
<th>Winner</th> <th><i class="fas fa-tag"></i> Name</th>
<th>Status</th> <th><i class="fas fa-gamepad"></i> Platform</th>
<th>Actions</th> <th><i class="fas fa-crown"></i> Winner</th>
</tr> <th><i class="fas fa-info-circle"></i> Status</th>
</thead> <th><i class="fas fa-cog"></i> Actions</th>
<tbody> </tr>
{% for giveaway in giveaways %} </thead>
<tr> <tbody>
<td>{{ giveaway.name }}</td> {% if giveaways %}
<td>{{ giveaway.platform }}</td> {% for giveaway in giveaways %}
<td>{{ giveaway.winner_dc_id }}</td> <tr>
<td> <td><strong>{{ giveaway.name }}</strong></td>
{% if giveaway.aktiv %} <td>{{ giveaway.platform }}</td>
<span class="badge badge-success status-badge">Redeemed</span> <td>{{ giveaway.winner_dc_id or 'Not Assigned' }}</td>
{% else %} <td>
<span class="badge badge-warning status-badge">Not Redeemed</span> {% if giveaway.aktiv %}
{% endif %} <span class="badge badge-success-custom status-badge">
</td> <i class="fas fa-check"></i> Redeemed
<td> </span>
<a href="{{ url_for('edit_giveaway', guild_id=guild_id, uuid=giveaway['uuid']) }}" class="btn btn-primary btn-sm">Edit</a> {% else %}
</td> <span class="badge badge-warning-custom status-badge">
</tr> <i class="fas fa-hourglass-half"></i> Pending
{% endfor %} </span>
</tbody> {% endif %}
</table> </td>
</div> <td>
</div> <a href="{{ url_for('edit_giveaway', guild_id=guild_id, uuid=giveaway['uuid']) }}" class="admin-btn">
</div> <i class="fas fa-edit"></i> Edit
</a>
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="5" class="text-center" style="color: #a0aec0; padding: 2rem;">
<i class="fas fa-gift" style="font-size: 2rem; margin-bottom: 1rem; display: block;"></i>
No giveaways found for this server.
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</div>
<!-- User Management Section --> <!-- User Management Section -->
<div class="card mt-4"> <div class="admin-card">
<div class="card-body"> <div class="card-body">
<h5 class="card-title">User Management</h5> <h5 class="card-title">
<p class="card-text">Manage server members' data, including points, bans, and permissions.</p> <i class="fas fa-users section-icon user-icon"></i>User Management
<div class="table-responsive scrollable-table"> </h5>
<table class="table table-bordered"> <p class="card-text">Manage server members' data, including points, bans, and permissions.</p>
<thead> <div class="table-responsive scrollable-table">
<tr> <table class="table">
<th>User ID</th> <thead>
<th>Points</th> <tr>
<th>Level</th> <th><i class="fas fa-id-card"></i> User ID</th>
<th>Banned</th> <th><i class="fas fa-coins"></i> Points</th>
<th>Actions</th> <th><i class="fas fa-layer-group"></i> Level</th>
</tr> <th><i class="fas fa-ban"></i> Status</th>
</thead> <th><i class="fas fa-cog"></i> Actions</th>
<tbody> </tr>
{% for user in server_users %} </thead>
<tr> <tbody>
<td>{{ user.user_id }}</td> {% if server_users %}
<td>{{ user.points }}</td> {% for user in server_users %}
<td>{{ user.level }}</td> <tr>
<td> <td><code>{{ user.user_id }}</code></td>
{% if user.ban %} <td>{{ "{:,}".format(user.points) }}</td>
<span class="badge badge-danger status-badge">Banned</span> <td>{{ user.level }}</td>
{% else %} <td>
<span class="badge badge-success status-badge">Active</span> {% if user.ban %}
{% endif %} <span class="badge badge-danger-custom status-badge">
</td> <i class="fas fa-ban"></i> Banned
<td> </span>
<a href="{{ url_for('edit_user', guild_id=guild_id, user_id=user.user_id) }}" class="btn btn-primary btn-sm">Edit</a> {% else %}
</td> <span class="badge badge-success-custom status-badge">
</tr> <i class="fas fa-check"></i> Active
{% endfor %} </span>
</tbody> {% endif %}
</table> </td>
<td>
<a href="{{ url_for('edit_user', guild_id=guild_id, user_id=user.user_id) }}" class="admin-btn">
<i class="fas fa-edit"></i> Edit
</a>
</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="5" class="text-center" style="color: #a0aec0; padding: 2rem;">
<i class="fas fa-users" style="font-size: 2rem; margin-bottom: 1rem; display: block;"></i>
No users found for this server.
</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -5,48 +5,255 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>User Dashboard</title> <title>User Dashboard</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #e0e0e0;
}
.dashboard-container {
background: rgba(30, 30, 46, 0.95);
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 2rem;
margin-top: 2rem;
}
.welcome-header {
text-align: center;
margin-bottom: 3rem;
}
.welcome-title {
color: #f8f9fa;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.5);
}
.welcome-subtitle {
color: #a0a0a0;
font-size: 1.1rem;
font-weight: 400;
}
.stat-card {
background: rgba(45, 55, 72, 0.8);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
margin-bottom: 2rem;
}
.stat-card:hover {
transform: translateY(-5px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.4);
}
.stat-card .card-body {
padding: 2rem;
text-align: center;
}
.stat-title {
color: #cbd5e0;
font-weight: 600;
font-size: 1.2rem;
margin-bottom: 1rem;
}
.stat-value {
color: #f7fafc;
font-size: 3rem;
font-weight: 700;
text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
margin-bottom: 1rem;
}
.stat-icon {
font-size: 2rem;
margin-bottom: 1rem;
}
.points-icon { color: #ffd700; }
.level-icon { color: #48bb78; }
.admin-icon { color: #e53e3e; }
.giveaway-icon { color: #4299e1; }
.admin-card {
background: linear-gradient(135deg, rgba(229, 62, 62, 0.2) 0%, rgba(197, 48, 48, 0.2) 100%);
border: 1px solid rgba(229, 62, 62, 0.3);
}
.action-button {
background: linear-gradient(135deg, #4299e1, #3182ce);
border: none;
border-radius: 25px;
padding: 0.75rem 2rem;
color: #ffffff;
font-weight: 600;
text-decoration: none;
display: inline-block;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(66, 153, 225, 0.3);
}
.action-button:hover {
background: linear-gradient(135deg, #3182ce, #2c5282);
color: #ffffff;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(66, 153, 225, 0.4);
}
.admin-button {
background: linear-gradient(135deg, #e53e3e, #c53030);
box-shadow: 0 4px 12px rgba(229, 62, 62, 0.3);
}
.admin-button:hover {
background: linear-gradient(135deg, #c53030, #9c2626);
box-shadow: 0 8px 25px rgba(229, 62, 62, 0.4);
}
.giveaway-button {
background: linear-gradient(135deg, #38a169, #2f855a);
box-shadow: 0 4px 12px rgba(56, 161, 105, 0.3);
}
.giveaway-button:hover {
background: linear-gradient(135deg, #2f855a, #276749);
box-shadow: 0 8px 25px rgba(56, 161, 105, 0.4);
}
.leaderboard-button {
background: linear-gradient(135deg, #805ad5, #6b46c1);
box-shadow: 0 4px 12px rgba(128, 90, 213, 0.3);
}
.leaderboard-button:hover {
background: linear-gradient(135deg, #6b46c1, #553c9a);
box-shadow: 0 8px 25px rgba(128, 90, 213, 0.4);
}
.additional-options {
background: rgba(45, 55, 72, 0.6);
border-radius: 15px;
padding: 2rem;
margin-top: 2rem;
border: 1px solid rgba(255, 255, 255, 0.1);
}
.section-title {
color: #f7fafc;
font-weight: 600;
font-size: 1.5rem;
margin-bottom: 1.5rem;
text-align: center;
}
/* Responsive Design */
@media (max-width: 768px) {
.welcome-title {
font-size: 2rem;
}
.stat-value {
font-size: 2.5rem;
}
.dashboard-container {
padding: 1rem;
margin-top: 1rem;
}
}
</style>
</head> </head>
<body> <body>
{% include 'navigation.html' %} {% include 'navigation.html' %}
<div class="container mt-5"> <div class="container-fluid">
<div class="text-center"> <div class="row justify-content-center">
<h1>Welcome, {{ g.user_info['username'] }}!</h1> <div class="col-lg-10 col-xl-8">
<p class="text-muted">Your personalized dashboard for server <strong>{{ g.guild_id }}</strong></p> <div class="dashboard-container">
</div> <div class="welcome-header">
<h1 class="welcome-title">
<i class="fas fa-user-circle"></i> Welcome, {{ g.user_info['username'] }}!
</h1>
<p class="welcome-subtitle">Your personalized dashboard for server <strong>{{ g.guild_id }}</strong></p>
</div>
<div class="row mt-5"> <div class="row">
<!-- User Points and Level Card --> <!-- User Points Card -->
<div class="col-md-6"> <div class="col-md-6">
<div class="card shadow-sm"> <div class="stat-card">
<div class="card-body text-center"> <div class="card-body">
<h5 class="card-title">Your Points</h5> <i class="fas fa-coins stat-icon points-icon"></i>
<p class="display-4">{{ g.user_data['points'] }}</p> <h5 class="stat-title">Your Points</h5>
<h5 class="card-title mt-4">Level</h5> <p class="stat-value">{{ "{:,}".format(g.user_data['points']) }}</p>
<p class="display-4">{{ g.user_data['level'] }}</p> </div>
</div>
</div>
<!-- User Level Card -->
<div class="col-md-6">
<div class="stat-card">
<div class="card-body">
<i class="fas fa-layer-group stat-icon level-icon"></i>
<h5 class="stat-title">Level</h5>
<p class="stat-value">{{ g.user_data['level'] }}</p>
</div>
</div>
</div>
<!-- Server Admin Link Card -->
{% if g.user_data['permission'] >= 8 %}
<div class="col-md-12">
<div class="stat-card admin-card">
<div class="card-body">
<i class="fas fa-crown stat-icon admin-icon"></i>
<h5 class="stat-title">Server Admin Dashboard</h5>
<p class="welcome-subtitle">Manage server-specific settings for server <strong>{{ g.guild_id }}</strong>.</p>
<a href="{{ url_for('server_admin_dashboard', guild_id=g.guild_id) }}" class="action-button admin-button mt-3">
<i class="fas fa-cogs"></i> Go to Admin Dashboard
</a>
</div>
</div>
</div>
{% endif %}
</div>
<!-- Additional Options -->
<div class="additional-options">
<h5 class="section-title">
<i class="fas fa-rocket"></i> Quick Actions
</h5>
<div class="row text-center">
<div class="col-md-4 mb-3">
<a href="{{ url_for('user_giveaways', guild_id=g.guild_id) }}" class="action-button giveaway-button">
<i class="fas fa-gift"></i> View Won Giveaways
</a>
</div>
<div class="col-md-4 mb-3">
<a href="{{ url_for('leaderboard', guild_id=g.guild_id) }}" class="action-button leaderboard-button">
<i class="fas fa-trophy"></i> View Leaderboard
</a>
</div>
<div class="col-md-4 mb-3">
<a href="{{ url_for('user_server_data', guild_id=g.guild_id) }}" class="action-button">
<i class="fas fa-chart-bar"></i> View Statistics
</a>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
<!-- Server Admin Link Card -->
{% if g.user_data['permission'] >= 8 %}
<div class="col-md-6">
<div class="card shadow-sm">
<div class="card-body text-center">
<h5 class="card-title">Server Admin Dashboard</h5>
<p class="text-muted">Manage server-specific settings for server <strong>{{ g.guild_id }}</strong>.</p>
<a href="{{ url_for('server_admin_dashboard', guild_id=g.guild_id) }}" class="btn btn-primary btn-lg mt-3">Go to Admin Dashboard</a>
</div>
</div>
</div>
{% endif %}
</div>
<!-- Additional Options -->
<div class="row mt-5">
<div class="col-12 text-center">
<h5>Your Giveaways</h5>
<a href="{{ url_for('user_giveaways', guild_id=g.guild_id) }}" class="btn btn-info mt-3">View Won Giveaways</a>
</div>
</div> </div>
</div> </div>
</body> </body>

View File

@@ -5,68 +5,259 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Your Won Giveaways - {{ guild_name }}</title> <title>Your Won Giveaways - {{ guild_name }}</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style> <style>
.table-container { body {
background-color: #f8f9fa; background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
padding: 2rem; min-height: 100vh;
border-radius: 10px; font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); color: #e0e0e0;
} }
.giveaways-container {
background: rgba(30, 30, 46, 0.95);
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 2rem;
margin-top: 2rem;
}
.giveaways-header {
text-align: center;
margin-bottom: 2rem;
}
.giveaways-title {
color: #f8f9fa;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.5);
}
.giveaways-subtitle {
color: #a0a0a0;
font-size: 1.1rem;
font-weight: 400;
}
.gift-icon {
font-size: 3rem;
color: #ffd700;
margin-bottom: 1rem;
animation: bounce 2s infinite;
text-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
40% { transform: translateY(-10px); }
60% { transform: translateY(-5px); }
}
.table-container {
background: rgba(40, 40, 56, 0.9);
border-radius: 15px;
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
.table {
margin-bottom: 0;
color: #e0e0e0;
}
.table thead th {
background: linear-gradient(135deg, #2d3748 0%, #1a202c 100%);
color: #f7fafc;
border: none;
padding: 1rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
font-size: 0.9rem;
}
.table tbody tr {
background: rgba(45, 55, 72, 0.6);
transition: all 0.3s ease;
border: none;
}
.table tbody tr:hover {
background: rgba(74, 85, 104, 0.8);
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
}
.table tbody td {
padding: 1rem;
vertical-align: middle;
border: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
color: #e0e0e0;
}
.status-badge { .status-badge {
font-size: 0.9rem; font-size: 0.9rem;
padding: 0.5em; padding: 0.5rem 1rem;
border-radius: 5px; border-radius: 25px;
font-weight: 600;
} }
.badge-success-custom {
background: linear-gradient(135deg, #48bb78, #38a169);
color: white;
box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
}
.badge-warning-custom {
background: linear-gradient(135deg, #ffa500, #ff8c00);
color: white;
box-shadow: 0 4px 12px rgba(255, 165, 0, 0.3);
}
.redeem-btn { .redeem-btn {
background: linear-gradient(135deg, #4299e1, #3182ce);
border: none;
border-radius: 25px;
padding: 0.5rem 1.5rem;
color: #ffffff;
font-weight: 600;
text-decoration: none;
font-size: 0.9rem; font-size: 0.9rem;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(66, 153, 225, 0.3);
} }
h2 {
color: #343a40; .redeem-btn:hover {
background: linear-gradient(135deg, #3182ce, #2c5282);
color: #ffffff;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(66, 153, 225, 0.4);
}
.back-button {
background: linear-gradient(135deg, #4a5568, #2d3748);
border: none;
border-radius: 25px;
padding: 0.75rem 2rem;
color: #f7fafc;
font-weight: 600;
text-decoration: none;
display: inline-block;
transition: all 0.3s ease;
margin-top: 2rem;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.back-button:hover {
background: linear-gradient(135deg, #2d3748, #1a202c);
color: #f7fafc;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4);
}
.no-giveaways {
text-align: center;
padding: 3rem;
color: #a0aec0;
}
.no-giveaways-icon {
font-size: 4rem;
color: #4a5568;
margin-bottom: 1rem;
}
/* Responsive Design */
@media (max-width: 768px) {
.giveaways-title {
font-size: 2rem;
}
.giveaways-container {
padding: 1rem;
margin-top: 1rem;
}
.table thead th,
.table tbody td {
padding: 0.75rem 0.5rem;
font-size: 0.9rem;
}
} }
</style> </style>
</head> </head>
<body> <body>
{% include 'navigation.html' %} {% include 'navigation.html' %}
<div class="container mt-5"> <div class="container-fluid">
<h2 class="text-center">Your Won Giveaways on {{ guild_name }}</h2> <div class="row justify-content-center">
<p class="text-center text-muted">Here you can view all the giveaways you've won on this server.</p> <div class="col-lg-10 col-xl-8">
<div class="giveaways-container">
<div class="giveaways-header">
<i class="fas fa-gift gift-icon"></i>
<h1 class="giveaways-title">Your Won Giveaways</h1>
<p class="giveaways-subtitle">{{ guild_name }} • View and redeem your prizes</p>
</div>
<div class="table-container mt-4"> {% if won_giveaways and won_giveaways|length > 0 %}
<table class="table table-striped"> <div class="table-container">
<thead> <table class="table">
<tr> <thead>
<th scope="col">Name</th> <tr>
<th scope="col">Platform</th> <th scope="col"><i class="fas fa-tag"></i> Name</th>
<th scope="col">Status</th> <th scope="col"><i class="fas fa-gamepad"></i> Platform</th>
<th scope="col" class="text-center">Action</th> <th scope="col"><i class="fas fa-info-circle"></i> Status</th>
</tr> <th scope="col" class="text-center"><i class="fas fa-cog"></i> Action</th>
</thead> </tr>
<tbody> </thead>
{% for giveaway in won_giveaways %} <tbody>
<tr> {% for giveaway in won_giveaways %}
<td>{{ giveaway.name }}</td> <tr>
<td>{{ giveaway.platform }}</td> <td><strong>{{ giveaway.name }}</strong></td>
<td> <td>{{ giveaway.platform }}</td>
{% if giveaway.aktiv %} <td>
<span class="badge badge-success status-badge">Redeemed</span> {% if giveaway.aktiv %}
{% else %} <span class="badge badge-success-custom status-badge">
<span class="badge badge-warning status-badge">Not Redeemed</span> <i class="fas fa-check"></i> Redeemed
{% endif %} </span>
</td> {% else %}
<td class="text-center"> <span class="badge badge-warning-custom status-badge">
{% if giveaway.aktiv %} <i class="fas fa-hourglass-half"></i> Pending
<a href="{{ url_for('redeem_giveaway', guild_id=guild_id, uuid=giveaway['uuid']) }}" class="btn btn-secondary btn-sm redeem-btn">View Key</a> </span>
{% else %} {% endif %}
<a href="{{ url_for('redeem_giveaway', guild_id=guild_id, uuid=giveaway['uuid']) }}" class="btn btn-primary btn-sm redeem-btn">Redeem</a> </td>
{% endif %} <td class="text-center">
</td> <a href="{{ url_for('redeem_giveaway', guild_id=guild_id, uuid=giveaway.uuid) }}" class="redeem-btn">
</tr> <i class="fas fa-{{ 'eye' if giveaway.aktiv else 'download' }}"></i>
{% endfor %} {{ 'View Key' if giveaway.aktiv else 'Redeem' }}
</tbody> </a>
</table> </td>
{% if won_giveaways|length == 0 %} </tr>
<p class="text-center text-muted">You haven't won any giveaways on this server yet.</p> {% endfor %}
{% endif %} </tbody>
</table>
</div>
{% else %}
<div class="no-giveaways">
<i class="fas fa-gift-card no-giveaways-icon"></i>
<h3>No Giveaways Won Yet</h3>
<p>You haven't won any giveaways on this server yet. Keep participating to win amazing prizes!</p>
</div>
{% endif %}
<div class="text-center">
<a href="{{ url_for('user_dashboard', guild_id=guild_id) }}" class="back-button">
<i class="fas fa-arrow-left"></i> Back to Dashboard
</a>
</div>
</div>
</div>
</div> </div>
</div> </div>
</body> </body>

View File

@@ -0,0 +1,241 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Your Won Giveaways - {{ guild_name }}</title>
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #e0e0e0;
}
.giveaways-container {
background: rgba(30, 30, 46, 0.95);
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 2rem;
margin-top: 2rem;
}
.giveaways-header {
text-align: center;
margin-bottom: 2rem;
}
.giveaways-title {
color: #f8f9fa;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.5);
}
.giveaways-subtitle {
color: #a0a0a0;
font-size: 1.1rem;
font-weight: 400;
}
.gift-icon {
font-size: 3rem;
color: #ffd700;
margin-bottom: 1rem;
animation: bounce 2s infinite;
text-shadow: 0 0 20px rgba(255, 215, 0, 0.5);
}
@keyframes bounce {
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
40% { transform: translateY(-10px); }
60% { transform: translateY(-5px); }
}
.table-container {
background: rgba(40, 40, 56, 0.9);
border-radius: 15px;
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
.table {
margin-bottom: 0;
color: #e0e0e0;
}
.table thead th {
background: linear-gradient(135deg, #2d3748 0%, #1a202c 100%);
color: #f7fafc;
border: none;
padding: 1rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
font-size: 0.9rem;
}
.table tbody tr {
background: rgba(45, 55, 72, 0.6);
transition: all 0.3s ease;
border: none;
}
.table tbody tr:hover {
background: rgba(74, 85, 104, 0.8);
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
}
.table tbody td {
padding: 1rem;
vertical-align: middle;
border: none;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
color: #e0e0e0;
}
.status-badge {
font-size: 0.9rem;
padding: 0.5rem 1rem;
border-radius: 25px;
font-weight: 600;
}
.badge-success-custom {
background: linear-gradient(135deg, #48bb78, #38a169);
color: white;
box-shadow: 0 4px 12px rgba(72, 187, 120, 0.3);
}
.badge-warning-custom {
background: linear-gradient(135deg, #ffa500, #ff8c00);
color: white;
box-shadow: 0 4px 12px rgba(255, 165, 0, 0.3);
}
.redeem-btn {
background: linear-gradient(135deg, #4299e1, #3182ce);
border: none;
border-radius: 25px;
padding: 0.5rem 1.5rem;
color: #ffffff;
font-weight: 600;
text-decoration: none;
font-size: 0.9rem;
transition: all 0.3s ease;
box-shadow: 0 4px 12px rgba(66, 153, 225, 0.3);
}
.redeem-btn:hover {
background: linear-gradient(135deg, #3182ce, #2c5282);
color: #ffffff;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(66, 153, 225, 0.4);
}
.back-button {
background: linear-gradient(135deg, #4a5568, #2d3748);
border: none;
border-radius: 25px;
padding: 0.75rem 2rem;
color: #f7fafc;
font-weight: 600;
text-decoration: none;
display: inline-block;
transition: all 0.3s ease;
margin-top: 2rem;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.back-button:hover {
background: linear-gradient(135deg, #2d3748, #1a202c);
color: #f7fafc;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.4);
}
.no-giveaways {
text-align: center;
padding: 3rem;
color: #a0aec0;
}
.no-giveaways-icon {
font-size: 4rem;
color: #4a5568;
margin-bottom: 1rem;
}
/* Responsive Design */
@media (max-width: 768px) {
.giveaways-title {
font-size: 2rem;
}
.giveaways-container {
padding: 1rem;
margin-top: 1rem;
}
.table thead th,
.table tbody td {
padding: 0.75rem 0.5rem;
font-size: 0.9rem;
}
}
</style>
</head>
<body>
{% include 'navigation.html' %}
<div class="container mt-5">
<h2 class="text-center">Your Won Giveaways on {{ guild_name }}</h2>
<p class="text-center text-muted">Here you can view all the giveaways you've won on this server.</p>
<div class="table-container mt-4">
<table class="table table-striped">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Platform</th>
<th scope="col">Status</th>
<th scope="col" class="text-center">Action</th>
</tr>
</thead>
<tbody>
{% for giveaway in won_giveaways %}
<tr>
<td>{{ giveaway.name }}</td>
<td>{{ giveaway.platform }}</td>
<td>
{% if giveaway.aktiv %}
<span class="badge badge-success status-badge">Redeemed</span>
{% else %}
<span class="badge badge-warning status-badge">Not Redeemed</span>
{% endif %}
</td>
<td class="text-center">
{% if giveaway.aktiv %}
<a href="{{ url_for('redeem_giveaway', guild_id=guild_id, uuid=giveaway['uuid']) }}" class="btn btn-secondary btn-sm redeem-btn">View Key</a>
{% else %}
<a href="{{ url_for('redeem_giveaway', guild_id=guild_id, uuid=giveaway['uuid']) }}" class="btn btn-primary btn-sm redeem-btn">Redeem</a>
{% endif %}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if won_giveaways|length == 0 %}
<p class="text-center text-muted">You haven't won any giveaways on this server yet.</p>
{% endif %}
</div>
</div>
</body>
</html>

View File

@@ -4,30 +4,222 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>User Landing Page</title> <title>User Landing Page</title> <img src="https://cdn.discordapp.com/icons/{{ guild.id }}/{{ guild.icon }}.png"
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet"> class="server-icon"
alt="Server Icon"
onerror="this.style.display='none';">;"> <link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">
<style>
body {
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 50%, #0f3460 100%);
min-height: 100vh;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
color: #e0e0e0;
}
.landing-container {
background: rgba(30, 30, 46, 0.95);
border-radius: 20px;
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.3);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.1);
padding: 2rem;
margin-top: 2rem;
}
.welcome-header {
text-align: center;
margin-bottom: 3rem;
}
.welcome-title {
color: #f8f9fa;
font-weight: 700;
font-size: 2.5rem;
margin-bottom: 0.5rem;
text-shadow: 2px 2px 8px rgba(0, 0, 0, 0.5);
}
.welcome-subtitle {
color: #a0a0a0;
font-size: 1.2rem;
font-weight: 400;
}
.server-card {
background: rgba(45, 55, 72, 0.8);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
transition: all 0.3s ease;
margin-bottom: 2rem;
overflow: hidden;
}
.server-card:hover {
transform: translateY(-8px);
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.4);
border-color: rgba(255, 255, 255, 0.2);
}
.server-icon {
width: 100%;
height: 200px;
object-fit: cover;
border-radius: 15px 15px 0 0;
transition: transform 0.3s ease;
}
.server-card:hover .server-icon {
transform: scale(1.05);
}
.server-card .card-body {
padding: 1.5rem;
background: rgba(45, 55, 72, 0.9);
}
.server-title {
color: #f7fafc;
font-weight: 600;
font-size: 1.3rem;
margin-bottom: 1rem;
}
.server-description {
color: #cbd5e0;
font-size: 0.95rem;
margin-bottom: 1.5rem;
line-height: 1.5;
}
.server-button {
border-radius: 25px;
padding: 0.6rem 1.5rem;
font-weight: 600;
text-decoration: none;
display: inline-block;
transition: all 0.3s ease;
margin: 0.25rem;
border: none;
}
.btn-primary-custom {
background: linear-gradient(135deg, #4299e1, #3182ce);
color: #ffffff;
box-shadow: 0 4px 12px rgba(66, 153, 225, 0.3);
}
.btn-primary-custom:hover {
background: linear-gradient(135deg, #3182ce, #2c5282);
color: #ffffff;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(66, 153, 225, 0.4);
}
.btn-secondary-custom {
background: linear-gradient(135deg, #805ad5, #6b46c1);
color: #ffffff;
box-shadow: 0 4px 12px rgba(128, 90, 213, 0.3);
}
.btn-secondary-custom:hover {
background: linear-gradient(135deg, #6b46c1, #553c9a);
color: #ffffff;
text-decoration: none;
transform: translateY(-2px);
box-shadow: 0 8px 20px rgba(128, 90, 213, 0.4);
}
.no-servers {
text-align: center;
padding: 3rem;
color: #a0aec0;
}
.no-servers-icon {
font-size: 4rem;
color: #4a5568;
margin-bottom: 1rem;
}
.user-icon {
color: #4299e1;
margin-right: 0.5rem;
}
/* Responsive Design */
@media (max-width: 768px) {
.welcome-title {
font-size: 2rem;
}
.server-icon {
height: 150px;
}
.landing-container {
padding: 1rem;
margin-top: 1rem;
}
}
</style>
</head> </head>
<body> <body>
{% include 'navigation.html' %} {% include 'navigation.html' %}
<div class="container mt-5"> <div class="container-fluid">
<h1>Welcome, {{ g.user_info['username'] }}</h1> <div class="row justify-content-center">
<p>Select a server to view your server-specific data.</p> <div class="col-lg-10 col-xl-8">
<div class="landing-container">
<div class="welcome-header">
<h1 class="welcome-title">
<i class="fas fa-user-circle user-icon"></i>Welcome, {{ g.user_info['username'] }}!
</h1>
<p class="welcome-subtitle">Select a server to view your server-specific data and statistics.</p>
</div>
<div class="row"> <div class="row">
{% for guild in g.guilds %} {% if g.guilds %}
<div class="col-md-4 mt-3"> {% for guild in g.guilds %}
<div class="card"> <div class="col-lg-6 col-xl-4">
<img src="https://cdn.discordapp.com/icons/{{ guild.id }}/{{ guild.icon }}.png" class="card-img-top" alt="Server Icon"> <div class="server-card">
<div class="card-body"> <img src="https://cdn.discordapp.com/icons/{{ guild.id }}/{{ guild.icon }}.png"
<h5 class="card-title">{{ guild.name }}</h5> class="server-icon"
<p class="card-text">Select this server to view your data for {{ guild.name }}.</p> alt="Server Icon"
<a href="{{ url_for('user_dashboard', guild_id=guild.id) }}" class="btn btn-primary">View Server</a> onerror="this.onerror=null; this.src='data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iMTAwIiBjeT0iMTAwIiByPSIxMDAiIGZpbGw9IiM0YTU1NjgiLz48dGV4dCB4PSIxMDAiIHk9IjExMCIgZm9udC1mYW1pbHk9IkFyaWFsLCBzYW5zLXNlcmlmIiBmb250LXNpemU9IjYwIiBmaWxsPSIjZjdmYWZjIiB0ZXh0LWFuY2hvcj0ibWlkZGxlIj4ke guild.name[0] if guild.name else 'S'}</text></svg>';">
<a href="{{ url_for('leaderboard', guild_id=guild.id) }}" class="btn btn-secondary">View Leaderboard</a> <div class="card-body">
<h5 class="server-title">
<i class="fas fa-server"></i> {{ guild.name }}
</h5>
<p class="server-description">
Access your dashboard, statistics, and achievements for {{ guild.name }}.
</p>
<div class="text-center">
<a href="{{ url_for('user_dashboard', guild_id=guild.id) }}" class="server-button btn-primary-custom">
<i class="fas fa-tachometer-alt"></i> View Dashboard
</a>
<a href="{{ url_for('leaderboard', guild_id=guild.id) }}" class="server-button btn-secondary-custom">
<i class="fas fa-trophy"></i> Leaderboard
</a>
</div>
</div>
</div>
</div>
{% endfor %}
{% else %}
<div class="col-12">
<div class="no-servers">
<i class="fas fa-server no-servers-icon"></i>
<h3>No Servers Found</h3>
<p>You don't have access to any servers with this bot. Join a server with Multus Bot to get started!</p>
</div>
</div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>
{% endfor %}
</div> </div>
</div> </div>
</body> </body>