Class: Lita::Handlers::GitlabMergerequests

Inherits:
Handler
  • Object
show all
Defined in:
lib/lita/handlers/gitlab_mergerequests.rb

Constant Summary collapse

PROJECTS_LIST_KEY =
'gitlab_projects'
REMINDER_SETTINGS_HASH_KEY =
'gitlab_reminder'
SCHEDULER =
Rufus::Scheduler.new

Instance Method Summary collapse

Instance Method Details

#add_project(response) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
# 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) ⇒ Object



136
137
138
139
140
141
# 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_mrsObject



71
72
73
74
75
76
77
78
# 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) ⇒ Object



181
182
183
184
185
186
187
# 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) ⇒ Object



85
86
87
88
89
90
91
92
93
# 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) ⇒ Object



95
96
97
98
99
100
101
102
# 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_mrsObject



57
58
59
60
61
62
63
64
65
66
67
68
69
# 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

#projectsObject



49
50
51
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 49

def projects
  Gitlab.projects(membership: true).auto_paginate
end

#projects_in_listObject



53
54
55
# File 'lib/lita/handlers/gitlab_mergerequests.rb', line 53

def projects_in_list
  redis.lrange(PROJECTS_LIST_KEY, 0, -1)
end

#reminder_settingsObject



159
160
161
162
163
164
165
166
# 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) ⇒ Object



123
124
125
126
127
128
129
130
131
132
133
134
# 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) ⇒ Object



189
190
191
192
193
194
195
196
197
198
# 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) ⇒ Object



80
81
82
83
# 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) ⇒ Object



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# 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) ⇒ Object



168
169
170
171
172
173
174
175
176
177
178
179
# 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