Settings Update
This commit is contained in:
parent
be9cd52ac6
commit
a767b9d3b0
3
.gitignore
vendored
3
.gitignore
vendored
@ -72,4 +72,5 @@ npm-debug.log*
|
||||
# Temporary files
|
||||
*.tmp
|
||||
*.bak
|
||||
*.swp
|
||||
*.swp
|
||||
**/.claude/settings.local.json
|
||||
|
@ -52,13 +52,93 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
checkAuth();
|
||||
|
||||
// Load bot choices after a short delay to ensure auth is checked
|
||||
setTimeout(() => {
|
||||
setTimeout(async () => {
|
||||
const token = localStorage.getItem('authToken');
|
||||
if (token) {
|
||||
loadBotChoices();
|
||||
await loadBotChoices();
|
||||
// After loading bots, try to get media settings from first bot
|
||||
loadMediaSettingsFromServer();
|
||||
}
|
||||
}, 500);
|
||||
|
||||
// Function to load media settings from server
|
||||
async function loadMediaSettingsFromServer() {
|
||||
try {
|
||||
// First try to load from localStorage
|
||||
const savedConfig = localStorage.getItem('mediaConfig');
|
||||
if (savedConfig) {
|
||||
try {
|
||||
globalMediaConfig = JSON.parse(savedConfig);
|
||||
console.log('Loaded media config from localStorage:', globalMediaConfig);
|
||||
} catch (e) {
|
||||
console.error('Failed to parse saved media config from localStorage');
|
||||
}
|
||||
}
|
||||
|
||||
// Try to fetch bots to get server settings
|
||||
const token = localStorage.getItem('authToken');
|
||||
const botsResponse = await fetch(`${API_ENDPOINT}/api/bots`, {
|
||||
headers: { 'Authorization': token }
|
||||
});
|
||||
|
||||
if (!botsResponse.ok) {
|
||||
throw new Error('Failed to fetch bots');
|
||||
}
|
||||
|
||||
const bots = await botsResponse.json();
|
||||
if (bots.length > 0) {
|
||||
// Get the first bot with media_config
|
||||
for (const bot of bots) {
|
||||
if (bot.media_config) {
|
||||
console.log('Found media config in bot:', bot.id);
|
||||
|
||||
// Update only if server has values
|
||||
if (bot.media_config.primary_service) {
|
||||
globalMediaConfig.primaryService = bot.media_config.primary_service;
|
||||
}
|
||||
|
||||
if (bot.media_config.fallback_service) {
|
||||
globalMediaConfig.fallbackService = bot.media_config.fallback_service;
|
||||
}
|
||||
|
||||
// Update URLs based on services
|
||||
if (bot.media_config.primary_service === 'nip94' && bot.media_config.nip94_server_url) {
|
||||
globalMediaConfig.primaryURL = bot.media_config.nip94_server_url;
|
||||
} else if (bot.media_config.primary_service === 'blossom' && bot.media_config.blossom_server_url) {
|
||||
globalMediaConfig.primaryURL = bot.media_config.blossom_server_url;
|
||||
}
|
||||
|
||||
// Update fallback URL
|
||||
if (bot.media_config.fallback_service === 'nip94' && bot.media_config.nip94_server_url) {
|
||||
globalMediaConfig.fallbackURL = bot.media_config.nip94_server_url;
|
||||
} else if (bot.media_config.fallback_service === 'blossom' && bot.media_config.blossom_server_url) {
|
||||
globalMediaConfig.fallbackURL = bot.media_config.blossom_server_url;
|
||||
}
|
||||
|
||||
break; // Stop after finding first valid config
|
||||
}
|
||||
}
|
||||
|
||||
// Update UI with the config (either from localStorage or server)
|
||||
updateMediaSettingsUI();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error loading media settings from server:', error);
|
||||
// Still update UI with whatever we have
|
||||
updateMediaSettingsUI();
|
||||
}
|
||||
}
|
||||
|
||||
// Function to update the UI with the current globalMediaConfig
|
||||
function updateMediaSettingsUI() {
|
||||
if (primaryServer) primaryServer.value = globalMediaConfig.primaryService;
|
||||
if (primaryServerURL) primaryServerURL.value = globalMediaConfig.primaryURL;
|
||||
if (fallbackServer) fallbackServer.value = globalMediaConfig.fallbackService || 'none';
|
||||
if (fallbackServerURL) fallbackServerURL.value = globalMediaConfig.fallbackURL;
|
||||
|
||||
console.log('Updated media settings UI with:', globalMediaConfig);
|
||||
}
|
||||
|
||||
// Button click handlers
|
||||
if (loadContentBtn) loadContentBtn.addEventListener('click', handleLoadContent);
|
||||
if (uploadButton) uploadButton.addEventListener('click', handleFileUpload);
|
||||
@ -209,7 +289,7 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
}
|
||||
|
||||
// Handle saving media server settings
|
||||
function handleSaveMediaSettings() {
|
||||
async function handleSaveMediaSettings() {
|
||||
globalMediaConfig.primaryService = primaryServer.value;
|
||||
globalMediaConfig.primaryURL = primaryServerURL ? primaryServerURL.value.trim() : '';
|
||||
globalMediaConfig.fallbackService = fallbackServer.value === 'none' ? '' : fallbackServer.value;
|
||||
@ -218,7 +298,91 @@ document.addEventListener('DOMContentLoaded', () => {
|
||||
// Save to localStorage
|
||||
localStorage.setItem('mediaConfig', JSON.stringify(globalMediaConfig));
|
||||
|
||||
alert('Media server settings saved!');
|
||||
// Get the current bot ID if any is selected, we'll update it first
|
||||
let selectedBotId = null;
|
||||
if (botSelect && botSelect.value) {
|
||||
selectedBotId = botSelect.value;
|
||||
}
|
||||
|
||||
try {
|
||||
// Get the list of all bots first
|
||||
const token = localStorage.getItem('authToken');
|
||||
const botsResponse = await fetch(`${API_ENDPOINT}/api/bots`, {
|
||||
headers: { 'Authorization': token }
|
||||
});
|
||||
|
||||
if (!botsResponse.ok) {
|
||||
throw new Error('Failed to fetch bots');
|
||||
}
|
||||
|
||||
const bots = await botsResponse.json();
|
||||
console.log(`Found ${bots.length} bots to update with media settings`);
|
||||
|
||||
// For each bot, update its media config
|
||||
for (const bot of bots) {
|
||||
// If we have a selected bot, prioritize updating it first
|
||||
if (selectedBotId && bot.id.toString() === selectedBotId) {
|
||||
await updateBotMediaConfig(bot.id);
|
||||
}
|
||||
}
|
||||
|
||||
// Then update all other bots
|
||||
for (const bot of bots) {
|
||||
if (!selectedBotId || bot.id.toString() !== selectedBotId) {
|
||||
await updateBotMediaConfig(bot.id);
|
||||
}
|
||||
}
|
||||
|
||||
alert('Media server settings saved to all bots successfully!');
|
||||
} catch (error) {
|
||||
console.error('Failed to update bot media configs:', error);
|
||||
alert('Media settings saved locally, but failed to update bots: ' + error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function to update bot media config
|
||||
async function updateBotMediaConfig(botId) {
|
||||
try {
|
||||
const token = localStorage.getItem('authToken');
|
||||
// Format mapping between localStorage and server
|
||||
const configPayload = {
|
||||
media_config: {
|
||||
primary_service: globalMediaConfig.primaryService,
|
||||
fallback_service: globalMediaConfig.fallbackService,
|
||||
nip94_server_url: globalMediaConfig.primaryService === 'nip94' ? globalMediaConfig.primaryURL : '',
|
||||
blossom_server_url: globalMediaConfig.primaryService === 'blossom' ? globalMediaConfig.primaryURL : ''
|
||||
}
|
||||
};
|
||||
|
||||
// Also set the fallback URL if appropriate
|
||||
if (globalMediaConfig.fallbackService === 'nip94') {
|
||||
configPayload.media_config.nip94_server_url = globalMediaConfig.fallbackURL;
|
||||
} else if (globalMediaConfig.fallbackService === 'blossom') {
|
||||
configPayload.media_config.blossom_server_url = globalMediaConfig.fallbackURL;
|
||||
}
|
||||
|
||||
console.log(`Updating bot ${botId} with media config:`, configPayload);
|
||||
|
||||
const configResp = await fetch(`${API_ENDPOINT}/api/bots/${botId}/config`, {
|
||||
method: 'PUT',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': token
|
||||
},
|
||||
body: JSON.stringify(configPayload)
|
||||
});
|
||||
|
||||
if (!configResp.ok) {
|
||||
const errData = await configResp.json().catch(() => ({}));
|
||||
throw new Error(errData.error || `Failed to update media config for bot ${botId}`);
|
||||
}
|
||||
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(`Failed to update bot ${botId}:`, error);
|
||||
// Don't throw, just log and continue with other bots
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// ===================================================
|
||||
|
@ -1304,6 +1304,32 @@ async function checkAuth() {
|
||||
postModeSelect.value = bot.post_config.post_mode || 'kind20';
|
||||
}
|
||||
}
|
||||
|
||||
// If media_config is present
|
||||
if (bot.media_config) {
|
||||
// Set primary server type
|
||||
const primaryServerSelect = document.getElementById('botSettingsPrimaryServer');
|
||||
if (primaryServerSelect) {
|
||||
primaryServerSelect.value = bot.media_config.primary_service || 'nip94';
|
||||
}
|
||||
|
||||
// Set fallback server type
|
||||
const fallbackServerSelect = document.getElementById('botSettingsFallbackServer');
|
||||
if (fallbackServerSelect) {
|
||||
fallbackServerSelect.value = bot.media_config.fallback_service || '';
|
||||
}
|
||||
|
||||
// Set server URLs
|
||||
const nip94UrlInput = document.getElementById('botSettingsNip94Url');
|
||||
if (nip94UrlInput) {
|
||||
nip94UrlInput.value = bot.media_config.nip94_server_url || '';
|
||||
}
|
||||
|
||||
const blossomUrlInput = document.getElementById('botSettingsBlossomUrl');
|
||||
if (blossomUrlInput) {
|
||||
blossomUrlInput.value = bot.media_config.blossom_server_url || '';
|
||||
}
|
||||
}
|
||||
|
||||
// Show the modal
|
||||
if (typeof bootstrap !== 'undefined' && botSettingsModalEl) {
|
||||
@ -1424,7 +1450,19 @@ async function checkAuth() {
|
||||
|
||||
// Log the post mode selected for debugging
|
||||
console.log('Post mode selected:', postMode);
|
||||
alert('Setting post mode to: ' + postMode);
|
||||
|
||||
// Get media server configuration
|
||||
const primaryServer = document.getElementById('botSettingsPrimaryServer').value;
|
||||
const fallbackServer = document.getElementById('botSettingsFallbackServer').value;
|
||||
const nip94Url = document.getElementById('botSettingsNip94Url').value.trim();
|
||||
const blossomUrl = document.getElementById('botSettingsBlossomUrl').value.trim();
|
||||
|
||||
console.log('Media config:', {
|
||||
primaryServer,
|
||||
fallbackServer,
|
||||
nip94Url,
|
||||
blossomUrl
|
||||
});
|
||||
|
||||
const configPayload = {
|
||||
post_config: {
|
||||
@ -1432,6 +1470,12 @@ async function checkAuth() {
|
||||
hashtags: JSON.stringify(hashtagsArr),
|
||||
post_mode: postMode
|
||||
// We do not override 'enabled' here, so it remains as is
|
||||
},
|
||||
media_config: {
|
||||
primary_service: primaryServer,
|
||||
fallback_service: fallbackServer,
|
||||
nip94_server_url: nip94Url,
|
||||
blossom_server_url: blossomUrl
|
||||
}
|
||||
};
|
||||
|
||||
@ -1455,7 +1499,7 @@ async function checkAuth() {
|
||||
return;
|
||||
}
|
||||
|
||||
alert('Bot settings updated!');
|
||||
alert('Bot settings and media configuration updated!');
|
||||
|
||||
// Hide modal
|
||||
const modalEl = document.getElementById('botSettingsModal');
|
||||
|
@ -517,6 +517,38 @@
|
||||
</select>
|
||||
<div class="form-text">Choose how this bot will post images to Nostr</div>
|
||||
</div>
|
||||
|
||||
<!-- Media Server Configuration -->
|
||||
<div class="mb-3">
|
||||
<h5 class="border-top pt-3">Media Server Configuration</h5>
|
||||
<div class="row">
|
||||
<div class="col-md-6 mb-2">
|
||||
<label for="botSettingsPrimaryServer" class="form-label">Primary Media Server</label>
|
||||
<select id="botSettingsPrimaryServer" class="form-select mb-2">
|
||||
<option value="nip94">NIP-94 Server</option>
|
||||
<option value="blossom">Blossom Server</option>
|
||||
</select>
|
||||
<div class="mb-2">
|
||||
<label for="botSettingsNip94Url" class="form-label">NIP-94 URL</label>
|
||||
<input type="text" id="botSettingsNip94Url" class="form-control"
|
||||
placeholder="https://files.sovbit.host">
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<label for="botSettingsBlossomUrl" class="form-label">Blossom URL</label>
|
||||
<input type="text" id="botSettingsBlossomUrl" class="form-control"
|
||||
placeholder="https://cdn.sovbit.host/upload">
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6 mb-2">
|
||||
<label for="botSettingsFallbackServer" class="form-label">Fallback Server</label>
|
||||
<select id="botSettingsFallbackServer" class="form-select mb-2">
|
||||
<option value="">None</option>
|
||||
<option value="nip94">NIP-94 Server</option>
|
||||
<option value="blossom">Blossom Server</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
|
Loading…
x
Reference in New Issue
Block a user