OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-social / bridge-irc / index.js

74 lines · javascript ref:
import { Bridge } from './lib/bridge.js'

// CLI entry point
const args = parseArgs(typeof Pear !== 'undefined' ? Pear.config.args : process.argv.slice(2))

if (args.help) {
  console.log(`
bridge-irc — IRC ↔ Keet bidirectional bridge

Usage:
  bridge-irc --irc-server <host> --channel <#chan> --keet-room <roomId>

Options:
  --irc-server <host>    IRC server hostname (required)
  --irc-port <port>      IRC port (default: 6667, 6697 for TLS)
  --irc-nick <nick>      IRC nickname (default: keet-bridge)
  --irc-password <pass>  IRC server password
  --channel <#channel>   IRC channel to bridge (required)
  --tls                  Use TLS for IRC connection
  --keet-room <roomId>   Keet room ID to bridge (required)
  --keet-port <port>     Keet daemon port (default: 3117)
  --help                 Show this help
`)
  process.exit(0)
}

if (!args['irc-server'] || !args.channel || !args['keet-room']) {
  console.error('Error: --irc-server, --channel, and --keet-room are required')
  console.error('Run with --help for usage')
  process.exit(1)
}

const bridge = new Bridge({
  ircServer: args['irc-server'],
  ircPort: parseInt(args['irc-port'] || '6667'),
  ircNick: args['irc-nick'] || 'keet-bridge',
  ircPassword: args['irc-password'],
  ircChannel: args.channel,
  ircTls: args.tls || parseInt(args['irc-port'] || '0') === 6697,
  keetRoom: args['keet-room'],
  keetPort: parseInt(args['keet-port'] || '3117')
})

bridge.start().catch((err) => {
  console.error('Bridge failed to start:', err.message)
  process.exit(1)
})

// Graceful shutdown
process.on('SIGINT', () => bridge.stop().then(() => process.exit(0)))
process.on('SIGTERM', () => bridge.stop().then(() => process.exit(0)))

function parseArgs (argv) {
  const result = {}
  for (let i = 0; i < argv.length; i++) {
    const arg = argv[i]
    if (arg === '--help') {
      result.help = true
    } else if (arg === '--tls') {
      result.tls = true
    } else if (arg.startsWith('--')) {
      const key = arg.slice(2)
      const next = argv[i + 1]
      if (next && !next.startsWith('--')) {
        result[key] = next
        i++
      } else {
        result[key] = true
      }
    }
  }
  return result
}