class Lita::Handlers::GitlabMergerequests

Constants

PROJECTS_LIST_KEY
REMINDER_SETTINGS_HASH_KEY
SCHEDULER

Public Instance Methods

add_project(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 104
def add_project(response)
  project = response.matches[0][0].strip
  response.reply 'Add a to be monitored project into list.'
  response.reply "Trying to add '#{project}'.."
  if projects.find { |p| p.path_with_namespace == project }
    response.reply "Found '#{project}'!"

    if redis.lrange(PROJECTS_LIST_KEY, 0, -1).include?(project)
      response.reply 'Project is already in list.'
    else
      response.reply "Adding project '#{project}' into list..."
      redis.rpush(PROJECTS_LIST_KEY, project)
      response.reply 'Done! :tada:'
    end
  else
    response.reply "'#{project}' is not found in your project(s), you may want to check the input."
  end
end
configure_gitlab(_payload) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 136
def configure_gitlab(_payload)
  Gitlab.configure do |c|
    c.endpoint = config.api_endpoint
    c.private_token = config.personal_access_token
  end
end
formatted_pending_mrs() click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 71
def formatted_pending_mrs
  formatted_pending_mrs = []
  pending_mrs.each do |p_mr|
    formatted_pending_mrs << "In *'#{p_mr[:project]}'*"
    formatted_pending_mrs << p_mr[:merge_requests].map { |mr| "• #{mr.iid} <#{mr.web_url}|#{mr.title}> - #{(mr.assignee.nil? ? '_no assignee_' : mr.assignee.username)}" }.join("\n")
  end
  formatted_pending_mrs.join("\n")
end
get_reminder(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 181
def get_reminder(response)
  if reminder_settings
    response.reply "Current reminder cron expression is '#{reminder_settings['cron']}'"
  else
    response.reply 'No reminder found.'
  end
end
list_pending_mrs(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 85
def list_pending_mrs(response)
  response.reply 'List pending merge requests.'
  if projects_in_list.empty?
    response.reply "Mmm... you haven't add any project yet."
  else
    response.reply formatted_pending_mrs unless formatted_pending_mrs.empty?
  end
  response.reply 'Done.'
end
list_projects(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 95
def list_projects(response)
  response.reply 'List currently monitoring projects.'
  if projects_in_list.empty?
    response.reply "Mmm... you haven't add any project yet."
  else
    response.reply(projects_in_list.map { |p| p.prepend('• ') }.join("\n"))
  end
end
pending_mrs() click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 57
def pending_mrs
  pending_mrs = []
  projects_in_list.each do |p|
    merge_requests = Gitlab.merge_requests(p, state: 'opened', wip: 'no')
    next unless merge_requests.count.positive?

    pending_mrs << {
      project: p,
      merge_requests: merge_requests
    }
  end
  pending_mrs
end
projects() click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 49
def projects
  Gitlab.projects(membership: true).auto_paginate
end
projects_in_list() click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 53
def projects_in_list
  redis.lrange(PROJECTS_LIST_KEY, 0, -1)
end
reminder_settings() click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 159
def reminder_settings
  reminder_settings = redis.hgetall(REMINDER_SETTINGS_HASH_KEY) # Hash
  if reminder_settings.empty?
    nil
  else
    reminder_settings
  end
end
remove_project(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 123
def remove_project(response)
  project = response.matches[0][0].strip
  response.reply 'Remove a currently monitoring project from list.'
  response.reply "Trying to remove '#{response.matches[0][0]}'.."
  if redis.lrange(PROJECTS_LIST_KEY, 0, -1).include?(project)
    response.reply 'Project is in list, removing it...'
    redis.lrem(PROJECTS_LIST_KEY, 0, project)
    response.reply 'Done! :tada:'
  else
    response.reply "#{project}' is not found in list."
  end
end
remove_reminder(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 189
def remove_reminder(response)
  if reminder_settings
    response.reply 'Removing reminder...'
    redis.del(REMINDER_SETTINGS_HASH_KEY)
    SCHEDULER.cron_jobs.each(&:unschedule)
    response.reply 'Done!'
  else
    response.reply 'No reminder found.'
  end
end
runas(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 80
def runas(response)
  api_user = Gitlab.client.user
  response.reply "Current API operator account is owned by: #{api_user.name}"
end
set_reminder(response) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 143
def set_reminder(response)
  cron_expression = response.matches[0][0].strip
  response.reply "Setting cron expression '#{cron_expression}' for you or the current channel."
  begin
    Rufus::Scheduler.parse(cron_expression)
    redis.hset(REMINDER_SETTINGS_HASH_KEY, 'cron', cron_expression)
    redis.hset(REMINDER_SETTINGS_HASH_KEY, 'user', response.message.source.user.id)
    redis.hset(REMINDER_SETTINGS_HASH_KEY, 'room', response.message.source.room)
    set_reminder_cron
  rescue ArgumentError => error
    response.reply "Seems like you give me an invalid cron expression '#{cron_expression}' (*Error:* #{error.message})"
  rescue StandardError => error
    response.reply "Oops! (*Error:* #{error.message})"
  end
end
set_reminder_cron(_payload = nil) click to toggle source
# File lib/lita/handlers/gitlab_mergerequests.rb, line 168
def set_reminder_cron(_payload = nil)
  if reminder_settings
    log.info "Setting reminder as cron expression '#{reminder_settings['cron']}'"
    SCHEDULER.cron_jobs.each(&:unschedule)
    SCHEDULER.cron reminder_settings['cron'] do |_job|
      target = Source.new(user: reminder_settings['user'], room: reminder_settings['room'])
      robot.send_messages(target, formatted_pending_mrs)
    end
  else
    log.info 'No reminder found.'
  end
end