17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
# File 'lib/ferris-bueller/web_helpers.rb', line 17
def user_lookup params, threshold=0.75
data = api.send 'users.info', user: params[:user_id]
slack_user = {
key: data[:user][:id],
name: (data[:user][:real_name] || data[:user][:name]),
nick: data[:user][:name],
email: data[:user][:email]
}
log.info \
event: 'matching user',
slack_user: slack_user
jira_matches = store[:jira_users].values.map do |jira_user|
distances = [ :name, :nick ].map do |k|
compare slack_user[k], jira_user[k]
end.compact
mean_distance = 1.0 * distances.inject(:+) / distances.size
if mean_distance > threshold or distances.max > 0.99
{ user: jira_user, distance: mean_distance}
end
end.compact
jira_match = jira_matches.sort_by { |m| m[:distance] }.last
unless jira_match
log.warn \
event: 'unmatched user',
slack_user: slack_user
return nil
end
log.info \
event: 'matched user',
slack_user: slack_user,
jira_match: jira_match
return { slack: slack_user, jira: jira_match[:user] }
rescue StandardError => e
log.error \
error: 'could not lookup users',
event: 'exception',
exception: e.inspect,
class: e.class,
message: e.message.inspect,
backtrace: e.backtrace
return nil
end
|