// ao-cli includes an AO client that makes calls to a locla or remote AO server. // The ao-cli client has no store so it makes frequent (hopefully very quick) calls to get exactly the information it needs. // This requires us to make sure the AO API server's REST API is concise and efficient. // The only places ao-cli should call out to an AO server (i.e., use the API in api.js) are in this Use AO menu and in the Tests menu. import inquirer from 'inquirer' import { aoEnv } from './settings.js' import { isLoggedIn, loginPrompt, logout } from './session.js' import { getTopPriorityText } from './priority.js' import { startPublicBootstrap } from './bootstrap.js' import { AO_DEFAULT_HOSTNAME } from './api.js' import { cardMenu } from './cards.js' import { connectMenu } from './connect.js' import { headerStyle } from './styles.js' // Prints the Use AO Menu and executes the user's choice. Using the AO as a client occurs only under this menu item (except Tests menu). export default async function useAoMenu() { const loggedIn = isLoggedIn() console.log(`\n${headerStyle('AO')}\n`) if(loggedIn) { console.log('Logged in as:', aoEnv('AO_CLI_SESSION_USERNAME')) const topPriority = await getTopPriorityText() if(topPriority) { console.log('Top priority:', topPriority) } else { console.log('Error contacting server, is your AO server running? AO features might not work.') } } let aoMenuChoices = [] if(loggedIn) { aoMenuChoices.push( 'Deck', 'Chat', 'Connect', ) } aoMenuChoices.push( loggedIn ? 'Log Out' : 'Log In', 'Back to Main Menu' ) let answer try { answer = await inquirer.prompt({ name: 'ao_menu', type: 'list', message: 'Please choose:', choices: aoMenuChoices, pageSize: aoMenuChoices.length }) } catch(error) { if (error === 'EVENT_INTERRUPTED') { console.log('\nESC') return false } } switch(answer.ao_menu) { case 'Deck': //await todoList('My Todo List', ['Add full AO install process to ao-cli in convenient format', 'Add AO server unit tests to ao-cli', 'Get groceries', 'Play music every day']) while(await cardMenu()) {} break case 'Connect': while(await connectMenu()) {} break case 'Chat': while(await chatMenu()) {} break case 'Log In': console.log('\nao-cli will use the AO API to log into the AO server at', (aoEnv('AO_CLI_TARGET_HOSTNAME') || AO_DEFAULT_HOSTNAME) + '.') await loginPrompt() break case 'Log Out': await logout() //await spinnerWait('Logging out...') break case 'Back to Main Menu': return false } return true } // Prints a menu that allows you to join the global AO chatrooms async function chatMenu() { let answers = {} const PUBLIC_BOOTSTRAP_ENABLED = aoEnv('PUBLIC_BOOTSTRAP_ENABLED') if(PUBLIC_BOOTSTRAP_ENABLED) { // They previously enabled public bootstrapping, so check to make sure it is working and then hide the option // todo: start and then verify functioning of p2p boostrap method here // if it's already started don't start it again //if(!publicBootstrapStarted) { console.log("\nBootstrapping public AO swarm...") startPublicBootstrap() console.log("Bootstrapped (just kidding)") //} //answers['chat_menu'] = 'Enable p2p bootstrap' } const chatChoices = [ { name: 'Join public chatroom', value: 'browse_chatrooms', short: 'public chatrooms' }, { name: 'Join chatroom', value: 'join_chat', short: 'join chat' }, 'Address Book', 'Back to AO Menu', ] console.log(`\n${headerStyle('AO Public Chatrooms')}\n`) let answer try { answer = await inquirer.prompt({ name: 'chat_menu', type: 'list', message: 'Please choose:', choices: chatChoices }) } catch(error) { if (error === 'EVENT_INTERRUPTED') { console.log('\nESC') return false } } switch(answer.chat_menu) { case 'browse_chatrooms': console.log('Not yet implemented') break case 'join_chat': console.log('Not yet implemented') break case 'Address Book': console.log('The point of this address book is to make it possible to type short, one-word names and have them resolve to tor addresses.') console.log('Name a piece of data by saying name=data. For example, doge=5uc41o1...onion. Then \'doge\' will return the .onion address.') console.log('Querying with any synonym in a chain will return the final meanings they all point to.') console.log('Keys can have multiple values.') break case 'Back to AO Menu': return false } return true }