Update XP settings to include new configuration options and improve existing ones
Refactor `aethex-bot/public/dashboard.html` to update XP settings UI and `aethex-bot/server/webServer.js` to handle new XP configuration parameters, including enabling/disabling XP, message XP, reaction XP, and leveling difficulty. Replit-Commit-Author: Agent Replit-Commit-Session-Id: aed2e46d-25bb-4b73-81a1-bb9e8437c261 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 4e47823a-b103-49a5-a57b-388765b0bcd5 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/3bdfff67-975a-46ad-9845-fbb6b4a4c4b5/aed2e46d-25bb-4b73-81a1-bb9e8437c261/oWFvNCu Replit-Helium-Checkpoint-Created: true
This commit is contained in:
parent
3691dc4b08
commit
ab7fdce9dd
3 changed files with 95 additions and 76 deletions
6
.replit
6
.replit
|
|
@ -1,5 +1,5 @@
|
||||||
entrypoint = "aethex-bot/bot.js"
|
entrypoint = "aethex-bot/bot.js"
|
||||||
modules = ["nodejs-20"]
|
modules = ["nodejs-20", "postgresql-16"]
|
||||||
|
|
||||||
hidden = [".pythonlibs"]
|
hidden = [".pythonlibs"]
|
||||||
|
|
||||||
|
|
@ -21,6 +21,10 @@ externalPort = 80
|
||||||
localPort = 8080
|
localPort = 8080
|
||||||
externalPort = 8080
|
externalPort = 8080
|
||||||
|
|
||||||
|
[[ports]]
|
||||||
|
localPort = 41927
|
||||||
|
externalPort = 3000
|
||||||
|
|
||||||
[workflows]
|
[workflows]
|
||||||
runButton = "Project"
|
runButton = "Project"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1168,6 +1168,32 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form id="xpSettingsForm" class="admin-form">
|
<form id="xpSettingsForm" class="admin-form">
|
||||||
|
<div class="card">
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">General Settings</h3>
|
||||||
|
</div>
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="form-grid">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="form-toggle">
|
||||||
|
<input type="checkbox" id="xpEnabled" name="xp_enabled" checked>
|
||||||
|
<span class="toggle-slider"></span>
|
||||||
|
<span class="toggle-label">Enable XP System</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="levelCurve">Leveling Difficulty</label>
|
||||||
|
<select id="levelCurve" name="level_curve" class="form-input">
|
||||||
|
<option value="easy">Easy (50 XP base)</option>
|
||||||
|
<option value="normal" selected>Normal (100 XP base)</option>
|
||||||
|
<option value="hard">Hard (200 XP base)</option>
|
||||||
|
</select>
|
||||||
|
<span class="form-hint">Formula: level = sqrt(xp / base)</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">Message XP</h3>
|
<h3 class="card-title">Message XP</h3>
|
||||||
|
|
@ -1175,18 +1201,13 @@
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="form-grid">
|
<div class="form-grid">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="xpMsgMin">Minimum XP per Message</label>
|
<label for="messageXp">XP per Message</label>
|
||||||
<input type="number" id="xpMsgMin" name="message_xp_min" min="0" max="1000" value="15" class="form-input">
|
<input type="number" id="messageXp" name="message_xp" min="0" max="1000" value="15" class="form-input">
|
||||||
<span class="form-hint">Minimum XP earned per message</span>
|
<span class="form-hint">XP earned per message</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="xpMsgMax">Maximum XP per Message</label>
|
<label for="messageCooldown">Message Cooldown (seconds)</label>
|
||||||
<input type="number" id="xpMsgMax" name="message_xp_max" min="0" max="1000" value="25" class="form-input">
|
<input type="number" id="messageCooldown" name="message_cooldown" min="0" max="3600" value="60" class="form-input">
|
||||||
<span class="form-hint">Maximum XP earned per message</span>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="xpMsgCooldown">Message Cooldown (seconds)</label>
|
|
||||||
<input type="number" id="xpMsgCooldown" name="message_cooldown" min="0" max="3600" value="60" class="form-input">
|
|
||||||
<span class="form-hint">Time between earning XP from messages</span>
|
<span class="form-hint">Time between earning XP from messages</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1195,24 +1216,31 @@
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">Other XP Sources</h3>
|
<h3 class="card-title">Reaction XP</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="form-grid">
|
<div class="form-grid">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="xpReaction">XP per Reaction</label>
|
<label class="form-toggle">
|
||||||
<input type="number" id="xpReaction" name="reaction_xp" min="0" max="100" value="5" class="form-input">
|
<input type="checkbox" id="reactionXpEnabled" name="reaction_xp_enabled" checked>
|
||||||
|
<span class="toggle-slider"></span>
|
||||||
|
<span class="toggle-label">Enable Reaction XP</span>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="reactionXpGiven">XP for Giving Reactions</label>
|
||||||
|
<input type="number" id="reactionXpGiven" name="reaction_xp_given" min="0" max="100" value="2" class="form-input">
|
||||||
|
<span class="form-hint">XP earned when you react to a message</span>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="reactionXpReceived">XP for Receiving Reactions</label>
|
||||||
|
<input type="number" id="reactionXpReceived" name="reaction_xp_received" min="0" max="100" value="5" class="form-input">
|
||||||
<span class="form-hint">XP earned when someone reacts to your message</span>
|
<span class="form-hint">XP earned when someone reacts to your message</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="xpVoice">XP per Voice Minute</label>
|
<label for="reactionCooldown">Reaction Cooldown (seconds)</label>
|
||||||
<input type="number" id="xpVoice" name="voice_xp_per_minute" min="0" max="100" value="2" class="form-input">
|
<input type="number" id="reactionCooldown" name="reaction_cooldown" min="0" max="3600" value="30" class="form-input">
|
||||||
<span class="form-hint">XP earned per minute in voice channels</span>
|
<span class="form-hint">Time between earning reaction XP</span>
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="xpDaily">Daily Claim XP</label>
|
|
||||||
<input type="number" id="xpDaily" name="daily_xp" min="0" max="10000" value="100" class="form-input">
|
|
||||||
<span class="form-hint">XP from daily claim command</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -1220,55 +1248,37 @@
|
||||||
|
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h3 class="card-title">Level-Up Settings</h3>
|
<h3 class="card-title">Level-Up Announcements</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<div class="form-grid">
|
<div class="form-grid">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="xpBase">XP Base Difficulty</label>
|
<label for="levelupChannelId">Announcement Channel ID</label>
|
||||||
<input type="number" id="xpBase" name="xp_base" min="50" max="500" value="100" class="form-input">
|
<input type="text" id="levelupChannelId" name="levelup_channel_id" placeholder="Leave blank for current channel" class="form-input">
|
||||||
<span class="form-hint">Higher = slower leveling (formula: level = sqrt(xp/base))</span>
|
<span class="form-hint">Channel ID for level-up messages</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="levelUpChannel">Level-Up Announcement Channel</label>
|
<label for="levelupMessage">Custom Level-Up Message</label>
|
||||||
<select id="levelUpChannel" name="levelup_channel_id" class="form-input">
|
<input type="text" id="levelupMessage" name="levelup_message" placeholder="{user} reached level {level}!" class="form-input">
|
||||||
<option value="">Current Channel</option>
|
<span class="form-hint">Use {user}, {level}, {xp} placeholders</span>
|
||||||
</select>
|
|
||||||
<span class="form-hint">Where to announce level-ups</span>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="form-toggle">
|
<label class="form-toggle">
|
||||||
<input type="checkbox" id="levelUpEnabled" name="levelup_enabled" checked>
|
<input type="checkbox" id="levelupDm" name="levelup_dm">
|
||||||
<span class="toggle-slider"></span>
|
|
||||||
<span class="toggle-label">Enable Level-Up Messages</span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="form-toggle">
|
|
||||||
<input type="checkbox" id="levelUpDm" name="levelup_dm">
|
|
||||||
<span class="toggle-slider"></span>
|
<span class="toggle-slider"></span>
|
||||||
<span class="toggle-label">Send Level-Up via DM</span>
|
<span class="toggle-label">Send Level-Up via DM</span>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-header">
|
|
||||||
<h3 class="card-title">XP Multipliers</h3>
|
|
||||||
</div>
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="form-grid">
|
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="xpMultiplier">Global XP Multiplier</label>
|
<label class="form-toggle">
|
||||||
<input type="number" id="xpMultiplier" name="xp_multiplier" min="0.1" max="10" step="0.1" value="1.0" class="form-input">
|
<input type="checkbox" id="levelupEmbed" name="levelup_embed" checked>
|
||||||
<span class="form-hint">Multiplies all XP earned (1.0 = normal)</span>
|
<span class="toggle-slider"></span>
|
||||||
|
<span class="toggle-label">Use Rich Embed</span>
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="weekendMultiplier">Weekend Multiplier</label>
|
<label for="levelupEmbedColor">Embed Color</label>
|
||||||
<input type="number" id="weekendMultiplier" name="weekend_multiplier" min="1" max="10" step="0.1" value="1.5" class="form-input">
|
<input type="color" id="levelupEmbedColor" name="levelup_embed_color" value="#7c3aed" class="form-input" style="height:40px;padding:4px">
|
||||||
<span class="form-hint">Extra multiplier on weekends</span>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -499,41 +499,47 @@ function createWebServer(discordClient, supabase, options = {}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const {
|
const {
|
||||||
message_xp_min,
|
message_xp,
|
||||||
message_xp_max,
|
|
||||||
message_cooldown,
|
message_cooldown,
|
||||||
reaction_xp,
|
reaction_xp_enabled,
|
||||||
voice_xp_per_minute,
|
reaction_xp_given,
|
||||||
daily_xp,
|
reaction_xp_received,
|
||||||
xp_base,
|
reaction_cooldown,
|
||||||
|
level_curve,
|
||||||
|
xp_enabled,
|
||||||
levelup_channel_id,
|
levelup_channel_id,
|
||||||
levelup_enabled,
|
levelup_message,
|
||||||
levelup_dm,
|
levelup_dm,
|
||||||
xp_multiplier,
|
levelup_embed,
|
||||||
weekend_multiplier
|
levelup_embed_color,
|
||||||
|
multiplier_roles,
|
||||||
|
bonus_channels
|
||||||
} = req.body;
|
} = req.body;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { data: existing } = await supabase
|
const { data: existing } = await supabase
|
||||||
.from('xp_config')
|
.from('xp_config')
|
||||||
.select('id')
|
.select('guild_id')
|
||||||
.eq('guild_id', guildId)
|
.eq('guild_id', guildId)
|
||||||
.maybeSingle();
|
.maybeSingle();
|
||||||
|
|
||||||
const configData = {
|
const configData = {
|
||||||
guild_id: guildId,
|
guild_id: guildId,
|
||||||
message_xp_min: message_xp_min ?? 15,
|
message_xp: message_xp ?? 15,
|
||||||
message_xp_max: message_xp_max ?? 25,
|
|
||||||
message_cooldown: message_cooldown ?? 60,
|
message_cooldown: message_cooldown ?? 60,
|
||||||
reaction_xp: reaction_xp ?? 5,
|
reaction_xp_enabled: reaction_xp_enabled !== false,
|
||||||
voice_xp_per_minute: voice_xp_per_minute ?? 2,
|
reaction_xp_given: reaction_xp_given ?? 2,
|
||||||
daily_xp: daily_xp ?? 100,
|
reaction_xp_received: reaction_xp_received ?? 5,
|
||||||
xp_base: xp_base ?? 100,
|
reaction_cooldown: reaction_cooldown ?? 30,
|
||||||
|
level_curve: level_curve || 'normal',
|
||||||
|
xp_enabled: xp_enabled !== false,
|
||||||
levelup_channel_id: levelup_channel_id || null,
|
levelup_channel_id: levelup_channel_id || null,
|
||||||
levelup_enabled: levelup_enabled !== false,
|
levelup_message: levelup_message || null,
|
||||||
levelup_dm: levelup_dm === true,
|
levelup_dm: levelup_dm === true,
|
||||||
xp_multiplier: xp_multiplier ?? 1.0,
|
levelup_embed: levelup_embed !== false,
|
||||||
weekend_multiplier: weekend_multiplier ?? 1.5,
|
levelup_embed_color: levelup_embed_color || '#7c3aed',
|
||||||
|
multiplier_roles: multiplier_roles || [],
|
||||||
|
bonus_channels: bonus_channels || [],
|
||||||
updated_at: new Date().toISOString()
|
updated_at: new Date().toISOString()
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -545,7 +551,6 @@ function createWebServer(discordClient, supabase, options = {}) {
|
||||||
|
|
||||||
if (error) throw error;
|
if (error) throw error;
|
||||||
} else {
|
} else {
|
||||||
configData.created_at = new Date().toISOString();
|
|
||||||
const { error } = await supabase
|
const { error } = await supabase
|
||||||
.from('xp_config')
|
.from('xp_config')
|
||||||
.insert(configData);
|
.insert(configData);
|
||||||
|
|
@ -556,7 +561,7 @@ function createWebServer(discordClient, supabase, options = {}) {
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to save XP config:', error);
|
console.error('Failed to save XP config:', error);
|
||||||
res.status(500).json({ error: 'Failed to save settings' });
|
res.status(500).json({ error: 'Failed to save settings', details: error.message });
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue