284 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						|
<html lang="en" data-bs-theme="dark">
 | 
						|
 | 
						|
<head>
 | 
						|
    <meta charset="UTF-8">
 | 
						|
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
 | 
						|
    <title>Nostr Poster</title>
 | 
						|
 | 
						|
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
 | 
						|
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
 | 
						|
    <link rel="stylesheet" href="/assets/css/style.css">
 | 
						|
    <script type="module">
 | 
						|
        import { nip19 } from 'https://esm.sh/nostr-tools@1.10.0?bundle';
 | 
						|
        window.nostrTools = { nip19 };
 | 
						|
      </script>
 | 
						|
    <script src="/assets/js/main.js"></script>
 | 
						|
</head>
 | 
						|
 | 
						|
 | 
						|
<body>
 | 
						|
 | 
						|
    <nav class="navbar navbar-expand-lg navbar-dark">
 | 
						|
        <div class="container">
 | 
						|
            <a class="navbar-brand" href="/">
 | 
						|
                <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor"
 | 
						|
                    class="bi bi-send-fill me-2" viewBox="0 0 16 16">
 | 
						|
                    <path
 | 
						|
                        d="M15.964.686a.5.5 0 0 0-.65-.65L.767 5.855H.766l-.452.18a.5.5 0 0 0-.082.887l.41.26.001.002 4.995 3.178 3.178 4.995.002.002.26.41a.5.5 0 0 0 .886-.083l6-15Zm-1.833 1.89L6.637 10.07l-.215-.338a.5.5 0 0 0-.154-.154l-.338-.215 7.494-7.494 1.178-.471-.47 1.178Z" />
 | 
						|
                </svg>
 | 
						|
                Nostr Poster
 | 
						|
            </a>
 | 
						|
            <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
 | 
						|
                <span class="navbar-toggler-icon"></span>
 | 
						|
            </button>
 | 
						|
            <div class="collapse navbar-collapse" id="navbarNav">
 | 
						|
                <ul class="navbar-nav">
 | 
						|
                    <li class="nav-item">
 | 
						|
                        <a class="nav-link" href="/#bots">
 | 
						|
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
 | 
						|
                                class="bi bi-robot me-1" viewBox="0 0 16 16">
 | 
						|
                                <path
 | 
						|
                                    d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" />
 | 
						|
                                <path
 | 
						|
                                    d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" />
 | 
						|
                            </svg>
 | 
						|
                            Bots
 | 
						|
                        </a>
 | 
						|
                    </li>
 | 
						|
                    <li class="nav-item">
 | 
						|
                        <a class="nav-link" href="/content.html">
 | 
						|
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
 | 
						|
                                class="bi bi-images me-1" viewBox="0 0 16 16">
 | 
						|
                                <path d="M4.502 9a1.5 1.5 0 1 0 0-3 1.5 1.5 0 0 0 0 3z" />
 | 
						|
                                <path
 | 
						|
                                    d="M14.002 13a2 2 0 0 1-2 2h-10a2 2 0 0 1-2-2V5A2 2 0 0 1 2 3a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2v8a2 2 0 0 1-1.998 2zM14 2H4a1 1 0 0 0-1 1h9.002a2 2 0 0 1 2 2v7A1 1 0 0 0 15 11V3a1 1 0 0 0-1-1zM2.002 4a1 1 0 0 0-1 1v8l2.646-2.354a.5.5 0 0 1 .63-.062l2.66 1.773 3.71-3.71a.5.5 0 0 1 .577-.094l1.777 1.947V5a1 1 0 0 0-1-1h-10z" />
 | 
						|
                            </svg>
 | 
						|
                            Content
 | 
						|
                        </a>
 | 
						|
                    </li>
 | 
						|
                </ul>
 | 
						|
                <ul class="navbar-nav ms-auto">
 | 
						|
                    <li class="nav-item" id="loginButton">
 | 
						|
                        <button class="btn btn-primary">
 | 
						|
                            <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
 | 
						|
                                class="bi bi-lightning-fill me-1" viewBox="0 0 16 16">
 | 
						|
                                <path
 | 
						|
                                    d="M5.52.359A.5.5 0 0 1 6 0h4a.5.5 0 0 1 .474.658L8.694 6H12.5a.5.5 0 0 1 .395.807l-7 9a.5.5 0 0 1-.873-.454L6.823 9.5H3.5a.5.5 0 0 1-.48-.641l2.5-8.5z" />
 | 
						|
                            </svg>
 | 
						|
                            Login with Nostr
 | 
						|
                        </button>
 | 
						|
                    </li>
 | 
						|
                    <li class="nav-item d-none" id="userInfo">
 | 
						|
                        <span class="nav-link">Welcome, <span id="userPubkey" class="pubkey"></span></span>
 | 
						|
                    </li>
 | 
						|
                    <li class="nav-item d-none" id="logoutButton">
 | 
						|
                        <button class="btn btn-outline-danger">Logout</button>
 | 
						|
                    </li>
 | 
						|
                </ul>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
    </nav>
 | 
						|
 | 
						|
    <div class="container mt-4">
 | 
						|
        <div id="auth-section">
 | 
						|
            <div class="card">
 | 
						|
                <div class="card-body text-center">
 | 
						|
                    <h2 class="mb-4">Welcome to Nostr Poster</h2>
 | 
						|
                    <div class="row justify-content-center">
 | 
						|
                        <div class="col-md-8">
 | 
						|
                            <div class="mb-4">
 | 
						|
                                <svg xmlns="http://www.w3.org/2000/svg" width="80" height="80" fill="#9370DB"
 | 
						|
                                    class="bi bi-lightning-charge-fill" viewBox="0 0 16 16">
 | 
						|
                                    <path
 | 
						|
                                        d="M11.251.068a.5.5 0 0 1 .227.58L9.677 6.5H13a.5.5 0 0 1 .364.843l-8 8.5a.5.5 0 0 1-.842-.49L6.323 9.5H3a.5.5 0 0 1-.364-.843l8-8.5a.5.5 0 0 1 .615-.09z" />
 | 
						|
                                </svg>
 | 
						|
                            </div>
 | 
						|
                            <p class="lead mb-4">Automate your Nostr content posting with ease. Schedule posts, manage
 | 
						|
                                multiple bots, and more.</p>
 | 
						|
                            <p>Please login with your Nostr extension (NIP-07) to manage your bots.</p>
 | 
						|
                            <button class="btn btn-primary btn-lg px-4 mt-3"
 | 
						|
                                onclick="document.getElementById('loginButton').querySelector('button').click()">
 | 
						|
                                <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
 | 
						|
                                    class="bi bi-lightning-fill me-2" viewBox="0 0 16 16">
 | 
						|
                                    <path
 | 
						|
                                        d="M5.52.359A.5.5 0 0 1 6 0h4a.5.5 0 0 1 .474.658L8.694 6H12.5a.5.5 0 0 1 .395.807l-7 9a.5.5 0 0 1-.873-.454L6.823 9.5H3.5a.5.5 0 0 1-.48-.641l2.5-8.5z" />
 | 
						|
                                </svg>
 | 
						|
                                Login with Nostr
 | 
						|
                            </button>
 | 
						|
                        </div>
 | 
						|
                    </div>
 | 
						|
                </div>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
 | 
						|
        <div id="main-content" class="d-none">
 | 
						|
            <div id="bots-section">
 | 
						|
                <div class="d-flex justify-content-between align-items-center mb-4">
 | 
						|
                    <h2>
 | 
						|
                        <svg xmlns="http://www.w3.org/2000/svg" width="28" height="28" fill="#9370DB"
 | 
						|
                            class="bi bi-robot me-2" viewBox="0 0 16 16">
 | 
						|
                            <path
 | 
						|
                                d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" />
 | 
						|
                            <path
 | 
						|
                                d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" />
 | 
						|
                        </svg>
 | 
						|
                        Your Bots
 | 
						|
                    </h2>
 | 
						|
                    <button id="create-bot-btn" class="btn btn-success">
 | 
						|
                        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
 | 
						|
                            class="bi bi-plus-lg me-1" viewBox="0 0 16 16">
 | 
						|
                            <path fill-rule="evenodd"
 | 
						|
                                d="M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2Z" />
 | 
						|
                        </svg>
 | 
						|
                        Create New Bot
 | 
						|
                    </button>
 | 
						|
                </div>
 | 
						|
                <div id="bots-list" class="row">
 | 
						|
                    <!-- Bot cards will be rendered here -->
 | 
						|
                </div>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
    </div>
 | 
						|
 | 
						|
    <!-- Create Bot Modal -->
 | 
						|
    <div class="modal fade" id="createBotModal" tabindex="-1">
 | 
						|
        <div class="modal-dialog modal-dialog-centered">
 | 
						|
            <div class="modal-content">
 | 
						|
                <div class="modal-header">
 | 
						|
                    <h5 class="modal-title">
 | 
						|
                        <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#9370DB"
 | 
						|
                            class="bi bi-robot me-2" viewBox="0 0 16 16">
 | 
						|
                            <path
 | 
						|
                                d="M6 12.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 0 1h-3a.5.5 0 0 1-.5-.5ZM3 8.062C3 6.76 4.235 5.765 5.53 5.886a26.58 26.58 0 0 0 4.94 0C11.765 5.765 13 6.76 13 8.062v1.157a.933.933 0 0 1-.765.935c-.845.147-2.34.346-4.235.346-1.895 0-3.39-.2-4.235-.346A.933.933 0 0 1 3 9.219V8.062Zm4.542-.827a.25.25 0 0 0-.217.068l-.92.9a24.767 24.767 0 0 1-1.871-.183.25.25 0 0 0-.068.495c.55.076 1.232.149 2.02.193a.25.25 0 0 0 .189-.071l.754-.736.847 1.71a.25.25 0 0 0 .404.062l.932-.97a25.286 25.286 0 0 0 1.922-.188.25.25 0 0 0-.068-.495c-.538.074-1.207.145-1.98.189a.25.25 0 0 0-.166.076l-.754.785-.842-1.7a.25.25 0 0 0-.182-.135Z" />
 | 
						|
                            <path
 | 
						|
                                d="M8.5 1.866a1 1 0 1 0-1 0V3h-2A4.5 4.5 0 0 0 1 7.5V8a1 1 0 0 0-1 1v2a1 1 0 0 0 1 1v1a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2v-1a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1v-.5A4.5 4.5 0 0 0 10.5 3h-2V1.866ZM14 7.5V13a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V7.5A3.5 3.5 0 0 1 5.5 4h5A3.5 3.5 0 0 1 14 7.5Z" />
 | 
						|
                        </svg>
 | 
						|
                        Create New Bot
 | 
						|
                    </h5>
 | 
						|
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
 | 
						|
                </div>
 | 
						|
                <div class="modal-body">
 | 
						|
                    <form id="create-bot-form">
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botName" class="form-label">Bot Name</label>
 | 
						|
                            <input type="text" class="form-control" id="botName" required placeholder="e.g., MyArtBot">
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botDisplayName" class="form-label">Display Name</label>
 | 
						|
                            <input type="text" class="form-control" id="botDisplayName"
 | 
						|
                                placeholder="e.g., My Art Posting Bot">
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botBio" class="form-label">Bio</label>
 | 
						|
                            <textarea class="form-control" id="botBio" rows="3"
 | 
						|
                                placeholder="A brief description of your bot..."></textarea>
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botNip05" class="form-label">NIP-05 Identifier</label>
 | 
						|
                            <input type="text" class="form-control" id="botNip05"
 | 
						|
                                placeholder="e.g., bot@yourdomain.com">
 | 
						|
                            <div class="form-text">Optional. Used for verification.</div>
 | 
						|
                        </div>
 | 
						|
                        <hr class="border-secondary">
 | 
						|
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="keyOption" class="form-label">Key Option</label>
 | 
						|
                            <select class="form-select" id="keyOption">
 | 
						|
                                <option value="generate" selected>Generate new keypair</option>
 | 
						|
                                <option value="import">Import existing NSEC key</option>
 | 
						|
                            </select>
 | 
						|
                        </div>
 | 
						|
 | 
						|
                        <div id="nsecKeyInput" class="mb-3" style="display: none;">
 | 
						|
                            <label for="botNsecKey" class="form-label">NSEC Private Key</label>
 | 
						|
                            <div class="input-group">
 | 
						|
                                <input type="password" class="form-control" id="botNsecKey" placeholder="nsec1...">
 | 
						|
                                <button class="btn btn-secondary" type="button" id="toggleNsecKey">
 | 
						|
                                    <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
 | 
						|
                                        class="bi bi-eye" viewBox="0 0 16 16">
 | 
						|
                                        <path
 | 
						|
                                            d="M16 8s-3-5.5-8-5.5S0 8 0 8s3 5.5 8 5.5S16 8 16 8zM1.173 8a13.133 13.133 0 0 1 1.66-2.043C4.12 4.668 5.88 3.5 8 3.5c2.12 0 3.879 1.168 5.168 2.457A13.133 13.133 0 0 1 14.828 8c-.058.087-.122.183-.195.288-.335.48-.83 1.12-1.465 1.755C11.879 11.332 10.119 12.5 8 12.5c-2.12 0-3.879-1.168-5.168-2.457A13.134 13.134 0 0 1 1.172 8z" />
 | 
						|
                                        <path
 | 
						|
                                            d="M8 5.5a2.5 2.5 0 1 0 0 5 2.5 2.5 0 0 0 0-5zM4.5 8a3.5 3.5 0 1 1 7 0 3.5 3.5 0 0 1-7 0z" />
 | 
						|
                                    </svg>
 | 
						|
                                </button>
 | 
						|
                            </div>
 | 
						|
                            <div class="form-text">Enter your private key in nsec format. Your public key will be
 | 
						|
                                derived automatically.</div>
 | 
						|
                        </div>
 | 
						|
                    </form>
 | 
						|
                </div>
 | 
						|
                <div class="modal-footer">
 | 
						|
                    <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancel</button>
 | 
						|
                    <button type="button" class="btn btn-primary" id="save-bot-btn">
 | 
						|
                        <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor"
 | 
						|
                            class="bi bi-plus-lg me-1" viewBox="0 0 16 16">
 | 
						|
                            <path fill-rule="evenodd"
 | 
						|
                                d="M8 2a.5.5 0 0 1 .5.5v5h5a.5.5 0 0 1 0 1h-5v5a.5.5 0 0 1-1 0v-5h-5a.5.5 0 0 1 0-1h5v-5A.5.5 0 0 1 8 2Z" />
 | 
						|
                        </svg>
 | 
						|
                        Create Bot
 | 
						|
                    </button>
 | 
						|
                </div>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
    </div>
 | 
						|
 | 
						|
    <!-- Bot Settings Modal -->
 | 
						|
    <div class="modal fade" id="botSettingsModal" tabindex="-1">
 | 
						|
        <div class="modal-dialog modal-dialog-centered">
 | 
						|
            <div class="modal-content">
 | 
						|
                <div class="modal-header">
 | 
						|
                    <h5 class="modal-title">Bot Settings</h5>
 | 
						|
                    <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
 | 
						|
                </div>
 | 
						|
                <div class="modal-body">
 | 
						|
                    <form id="bot-settings-form">
 | 
						|
                        <!-- Basic fields -->
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botSettingsName" class="form-label">Name</label>
 | 
						|
                            <input type="text" class="form-control" id="botSettingsName">
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botSettingsDisplayName" class="form-label">Display Name</label>
 | 
						|
                            <input type="text" class="form-control" id="botSettingsDisplayName">
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botSettingsBio" class="form-label">Bio</label>
 | 
						|
                            <textarea class="form-control" id="botSettingsBio" rows="2"></textarea>
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botSettingsNip05" class="form-label">NIP-05</label>
 | 
						|
                            <input type="text" class="form-control" id="botSettingsNip05">
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botSettingsZap" class="form-label">Zap Address</label>
 | 
						|
                            <input type="text" class="form-control" id="botSettingsZap">
 | 
						|
                        </div>
 | 
						|
 | 
						|
                        <hr>
 | 
						|
 | 
						|
                        <!-- Post config fields -->
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botSettingsInterval" class="form-label">Posting Interval (minutes)</label>
 | 
						|
                            <input type="number" class="form-control" id="botSettingsInterval" value="60">
 | 
						|
                        </div>
 | 
						|
                        <div class="mb-3">
 | 
						|
                            <label for="botSettingsHashtags" class="form-label">Hashtags (comma-separated)</label>
 | 
						|
                            <input type="text" class="form-control" id="botSettingsHashtags">
 | 
						|
                        </div>
 | 
						|
                    </form>
 | 
						|
                </div>
 | 
						|
                <div class="modal-footer">
 | 
						|
                    <button class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
 | 
						|
                    <button class="btn btn-primary" id="botSettingsSaveBtn" onclick="saveBotSettings()">
 | 
						|
                        Save
 | 
						|
                    </button>
 | 
						|
                </div>
 | 
						|
            </div>
 | 
						|
        </div>
 | 
						|
    </div>
 | 
						|
 | 
						|
</body>
 | 
						|
 | 
						|
</html> |