Class: Lita::Handlers::Gitcamp

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

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.default_config(config) ⇒ Object



10
11
12
13
14
15
16
17
# File 'lib/lita/handlers/gitcamp.rb', line 10

def self.default_config(config)
  config.rooms = :all
  config.github_token = nil
  config.notify_chat = true
  config. = nil
  config.basecamp_password = nil
  config. = nil
end

Instance Method Details

#basecamp_clientObject



71
72
73
74
75
76
77
78
79
80
# File 'lib/lita/handlers/gitcamp.rb', line 71

def basecamp_client
  Bcx.configure do |config|
    config. = Lita.config.handlers.gitcamp.
  end
  
  Bcx::Client::HTTP.new(
    login: Lita.config.handlers.gitcamp.,
    password: Lita.config.handlers.gitcamp.basecamp_password
  )
end

#finish_basecamp_tasks(tasks) ⇒ Object



63
64
65
66
67
68
69
# File 'lib/lita/handlers/gitcamp.rb', line 63

def finish_basecamp_tasks(tasks)
  client = basecamp_client

  tasks.each do |t|
    client.projects(t[:project_id]).todos(t[:task_id]).update!(completed: true)
  end
end

#get_todos_numbers(issues, owner, repo) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/lita/handlers/gitcamp.rb', line 44

def get_todos_numbers(issues, owner, repo)
  todos = []
  client = Octokit::Client.new access_token: Lita.config.handlers.gitcamp.github_token
  issues.each do |i|
    # GET /repos/:owner/:repo/issues/:number
    issue = client.issue("#{owner}/#{repo}", i)
    todo_id = parse_issue_body(issue.body)
    todos << todo_id unless todo_id.nil?
  end

  todos
end

#parse_issue_body(body) ⇒ Object



57
58
59
60
61
# File 'lib/lita/handlers/gitcamp.rb', line 57

def parse_issue_body(body)
  regex = /basecamp.com\/\d+\/projects\/(\d+)(?:-\w*?)\/todos\/(\d+)/mi
  captures = body.match(regex).captures
  {project_id: captures[0], task_id: captures[1]}
end

#parse_payload(payload) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/lita/handlers/gitcamp.rb', line 32

def parse_payload(payload)
  issues = []
  if payload.has_key? "commits"
    regex = /(?:close|fix|resolve)\w*?\s\#(\d+)/im

    messages = payload["commits"].collect {|c| c["message"]}.join(",")
    issues = messages.scan(regex).flatten

    [issues, payload["repository"]["owner"]["name"], payload["repository"]["name"]]
  end
end

#receive(request, responce) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/lita/handlers/gitcamp.rb', line 19

def receive(request, responce)
  if request.params.has_key? "payload"
    payload = JSON.parse(request.params["payload"])
    colsed_issues, owner, repo = parse_payload payload

    return if colsed_issues.empty?
    tasks = get_todos_numbers(colsed_issues, owner, repo)
    return if tasks.empty?
    finish_basecamp_tasks(tasks)
    responce.reply "Basecamp tasks closed: #{tasks.count}" if Lita.config.handlers.gitcamp.notify_chat
  end
end