/
fiiwis.rb
70 lines (57 loc) · 1.49 KB
/
fiiwis.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
67
68
69
70
require 'rubygems'
require 'active_support'
class FiiwisMessage
def initialize(message)
@m = message
end
def tagged?
@m["event"] == "message" &&
@m["tags"].include?("fiiwis")
end
def valued?
[1, 2, 3, 4, 5].include?(value)
end
def date
Time.at(@m["sent"]/1000).strftime("%Y-%m-%d")
end
def week
Time.at(@m["sent"]/1000).strftime("%Y/%U")
end
def user
"User " + @m["user"]
end
def value
values = @m["content"].scan(/\b[0-9]\b/)
values.first.to_i if values.length == 1
end
def sanitized_message
@m["content"].gsub(/\s/, " ")
end
end
def write_csv(file, title_array, data_array)
File.open(file, "w") do |f|
f.puts(title_array.join("\t"))
f.puts(data_array.map { |m| m.join("\t") }.join("\n"))
end
end
messages = ActiveSupport::JSON.decode(File.read("messages.json"))
fiiwis_messages = messages.map { |m| FiiwisMessage.new(m) }.select(&:tagged?).select(&:valued?)
weeks = fiiwis_messages.map(&:week).uniq.sort
users = fiiwis_messages.map(&:user).uniq.sort
messages_by_weeks_and_users = fiiwis_messages.inject({}) { |hash, message|
hash[message.week] ||= {}
hash[message.week][message.user] = message
hash
}
write_csv(
"fiiwis_messages.csv",
%w(date user fiiwis message),
fiiwis_messages.map { |m|
[m.date, m.user, m.value, m.sanitized_message]
}
)
write_csv(
"fiiwis_matrix.csv",
["week"] + users,
weeks.map { |week| [week] + users.map { |user| messages_by_weeks_and_users[week][user].try(:value) } }
)