text: const qrTerm = require('qrcode-terminal')
  
  const { 
    Contact,
    log,
    Wechaty, 
  }           = require('wechaty')
  
  const welcome = `
  =============== Powered by Wechaty ===============
  -------- https://github.com/Chatie/wechaty --------
  
  I can list all your contacts with weixn id & name
  __________________________________________________
  
  Please wait... I'm trying to login in...
  `
  
  console.log(welcome)
  const bot = new Wechaty()
  
  bot.on('scan',    onScan)
  bot.on('login',   onLogin)
  bot.on('logout',  onLogout)
  bot.on('error',   onError)
  
  bot.start()
  .catch(console.error)
  
  function onScan (qrcode, status) {
    qrTerm.generate(qrcode, { small: true })  // show qrcode on console
  }
  
  function onLogin (user) {
    console.log(`${user} login`)
    main()
  }
  
  function onLogout (user) {
    console.log(`${user} logout`)
  }
  
  function onError (e) {
    console.error(e)
  }
  
  /**
   * Main Contact Bot
   */
  async function main() {
    const contactList = await bot.Contact.findAll()
  
    log.info('Bot', '#######################')
    log.info('Bot', 'Contact number: %d\n', contactList.length)
  
    /**
     * official contacts list
     */
    for (let i = 0; i < contactList.length; i++) {
      const contact = contactList[i]
      if (contact.type() === Contact.Type.Official) {
        log.info('Bot', `official ${i}: ${contact}`)
      }
    }
  
    /**
     *  personal contact list
     */
  
    for (let i = 0; i < contactList.length; i++) {
      const contact = contactList[i]
      if (contact.type() === Contact.Type.Personal) {
        log.info('Bot', `personal ${i}: ${contact.name()} : ${contact.id}`)
      }
    }
  
    const MAX = 17
    for (let i = 0; i < contactList.length; i++ ) {
      const contact = contactList[i]
  
      /**
       * Save avatar to file like: "1-name.jpg"
       */
      const file = await contact.avatar()
      const name = file.name
      await file.toFile(name, true)
  
      log.info('Bot', 'Contact: "%s" with avatar file: "%s"',
                      contact.name(),
                      name,
              )
  
      if (i > MAX) {
        log.info('Bot', 'Contacts too many, I only show you the first %d ... ', MAX)
        break
      }
    }
  
    const SLEEP = 7
    log.info('Bot', 'I will re-dump contact weixin id & names after %d second... ', SLEEP)
    setTimeout(main, SLEEP * 1000)
  
  }
  