class Nidobata::CLI

Constants

Client
CreateMessageMutation
HTTP
IDOBATA_URL
RoomListQuery
Schema

Public Instance Methods

api_token() click to toggle source
# File lib/nidobata.rb, line 113
def api_token
  Netrc.read[IDOBATA_URL.host]&.password
end
build_message(original_message, options) click to toggle source
# File lib/nidobata.rb, line 121
def build_message(original_message, options)
  return original_message if options.empty?

  title, pre = options.values_at(:title, :pre)

  message = pre ? "~~~#{pre}\n#{original_message}\n~~~" : original_message
  title ? "#{title}\n\n#{message}" : message
end
ensure_api_token() click to toggle source
# File lib/nidobata.rb, line 109
def ensure_api_token
  abort 'Run nidobata init for setup.' unless api_token
end
init() click to toggle source
# File lib/nidobata.rb, line 40
    def init
      email    = ask('Email:')
      password = ask('Password:', echo: false)
      puts

      http = Net::HTTP.new(IDOBATA_URL.host, IDOBATA_URL.port).tap {|h|
        h.use_ssl = IDOBATA_URL.scheme == 'https'
      }

      data = {grant_type: 'password', username: email, password: password}
      res  = http.post('/oauth/token', data.to_json, {'Content-Type' => 'application/json'})

      case res
      when Net::HTTPSuccess
        token = JSON.parse(res.body)['access_token']
        netrc = Netrc.read
        netrc[IDOBATA_URL.host] = email, token
        netrc.save
      when Net::HTTPUnauthorized
        abort 'Authentication failed. You may have entered wrong Email or Password.'
      else
        abort <<~EOS
          Failed to initialize.
          Status: #{res.code}
          Body:
          #{res.body}
        EOS
      end
    end
post(slug, room_name, message = $stdin.read) click to toggle source
# File lib/nidobata.rb, line 74
def post(slug, room_name, message = $stdin.read)
  abort 'Message is required.' unless message
  ensure_api_token

  room_id = query(RoomListQuery).data.viewer.rooms.edges.map(&:node).find {|room|
    room.organization.slug == slug && room.name == room_name
  }.id

  payload = {
    roomId: room_id,
    source: build_message(message, options),
    format: options[:pre] ? 'MARKDOWN' :
            options[:format] ? options[:format] : 'PLAIN'
  }

  query CreateMessageMutation, variables: {input: payload}
end
query(q, variables: {}, context: {}) click to toggle source
# File lib/nidobata.rb, line 117
def query(q, variables: {}, context: {})
  Client.query(q, variables: variables, context: {api_token: api_token}.merge(context))
end
rooms(slug = nil) click to toggle source
# File lib/nidobata.rb, line 93
def rooms(slug = nil)
  ensure_api_token

  rooms = query(RoomListQuery).data.viewer.rooms.edges.map(&:node)
  rooms.select! {|room| room.organization.slug == slug } if slug

  rooms.map {|room|
    "#{room.organization.slug}/#{room.name}"
  }.sort.each do |name|
    puts name
  end
end