-
Notifications
You must be signed in to change notification settings - Fork 4
/
osrc.py
225 lines (203 loc) · 6.16 KB
/
osrc.py
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
# coding=utf-8
"""
osrc.py - A module for displaying users open source report card, https://osrc.dfm.io/
Copyright 2014 Max Gurela
Licensed under the Eiffel Forum License 2.
"""
from __future__ import unicode_literals
import random
import json
from math import sqrt
from sopel import web
from sopel.module import commands, priority
import sys
if sys.version_info.major < 3:
from urllib2 import urlopen
else:
from urllib.request import urlopen
adjectives = [
"a high caliber",
"a heavy hitting",
"a serious",
"an awesome",
"a top notch",
"a trend setting",
"a champion",
"an epic",
"an exceptional",
"a distinguished",
"a noteworthy"
]
langs = {
"Python": "Pythonista",
"Java": "Javavore",
"Go": "Gopher",
"C": "low-level hacker",
"FORTRAN": "old-school hacker",
"JavaScript": "JavaScripter",
"R": "useR",
"Shell": "sysadmin",
"ActionScript": "Flasher",
"AppleScript": "OSXer",
"Arduino": "hardware hacker",
"Assembly": "hardcore hacker",
"Awk": "AWKward scripter",
"Objective-C": "Apple fanchild",
"CSS": "web designer",
"Perl": "regexer",
"VHDL": "VHDLyzer",
"Scala": "Scalaite",
"C#": "C Sharper",
"Ada": "DoD contractor",
"Haskell": "Haskeller",
"Clojure": "Clojurist",
"Rust": "Rustic"
}
event_actions = {
"CreateEvent": "creating new repositories and branches",
"CommitCommentEvent": "commenting on your commits",
"FollowEvent": "following other users",
"ForkEvent": "forking other people's code",
"IssuesEvent": "creating issues",
"IssueCommentEvent": "commenting on issues",
"PublicEvent": "open sourcing new projects",
"PullRequestEvent": "submitting pull requests"
}
week_types = [
{
"name": "a Tuesday tinkerer",
"vector": [1.0, 1.0, 10.0, 1.0, 1.0, 1.0, 1.0]
},
{
"name": "an early-week worker",
"vector": [1.0, 6.0, 4.0, 2.0, 1.0, 1.0, 1.0]
},
{
"name": "a weekend warrior",
"vector": [10.0, 1.0, 1.0, 1.0, 1.0, 1.0, 10.0]
},
{
"name": "a hump day hero",
"vector": [1.0, 1.0, 3.0, 10.0, 3.0, 1.0, 1.0]
},
{
"name": "a late-week deadliner",
"vector": [1.0, 1.0, 1.0, 3.0, 10.0, 1.0, 1.0]
},
{
"name": "a Friday hacker",
"vector": [1.0, 1.0, 1.0, 1.0, 1.0, 10.0, 1.0]
},
{
"name": "a fulltime hacker",
"vector": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]
},
{
"name": "a Sunday driver",
"vector": [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 10.0]
},
{
"name": "a nine-to-fiver",
"vector": [1.0, 5.0, 5.0, 5.0, 5.0, 5.0, 1.0]
}
]
time_of_day = [
{"times": [0, 1], "name": "around midnight"},
{"times": [1, 7], "name": "in the wee hours"},
{"times": [7, 12], "name": "in the morning"},
{"times": [12, 13], "name": "around noon"},
{"times": [13, 18], "name": "in the afternoon"},
{"times": [18, 21], "name": "in the evening"},
{"times": [21, 24], "name": "late at night"}
]
@commands('osrc', 'reportcard')
@priority('high')
def os_reportcard(bot, trigger):
"""
.osrc [nick] - If no nick is given, it will assume your IRC nick.
"""
try:
if not trigger.group(3):
raw = web.get('http://osrc.dfm.io/' + trigger.nick + '.json')
rawjson = json.loads(raw)
usage = rawjson['usage']
bot.say(format_text(trigger.nick, usage))
else:
raw = web.get('http://osrc.dfm.io/' + trigger.group(3) + '.json')
rawjson = json.loads(raw)
usage = rawjson['usage']
bot.say(format_text(trigger.group(3), usage))
except:
bot.say('User does not have github account, or has no activity.')
def format_text(user, usage):
user_vector = usage["week"]
norm = sqrt(sum([v * v for v in user_vector]))
if norm == 0:
return 'Not enough data found for user \'' + user + '\''
output = [
user,
' is ',
random.choice(adjectives),
' ',
language(usage),
' who ',
habits(usage),
'. ',
user,
' is ',
week_type(user_vector, norm, usage),
' who works best ',
best_time(usage),
'.'
]
return ''.join(output)
def best_time(usage):
best_time = (max(enumerate(usage["day"]), key=lambda o: o[1])[0], None)
for tod in time_of_day:
times = tod["times"]
if times[0] <= best_time[0] < times[1]:
best_time = (best_time[0], tod["name"])
if best_time[0] == 0 or best_time[0] == 12:
return best_time[1]
elif best_time[0] < 12:
return best_time[1] + ' (around ' + str(best_time[0]) + ' am)'
else:
return str(best_time[1]) + ' (around ' + str(best_time[0] - 12) + ' pm)'
def week_type(user_vector, norm, usage):
best_dist = -1
week_type = None
user_vector = [v / norm for v in user_vector]
for week in week_types:
vector = week["vector"]
norm = 1.0 / sqrt(sum([v * v for v in vector]))
dot = sum([(v * norm - w) ** 2 for v, w in zip(vector, user_vector)])
if best_dist < 0 or dot < best_dist:
best_dist = dot
week_type = week["name"]
return week_type
def language(usage):
if not (usage['languages'] or usage['languages'][0]):
return 'hacker'
final = ''
if usage['languages'][0]['language'] in langs:
final = langs[usage['languages'][0]['language']]
else:
final = usage['languages'][0]['language'] + ' coder'
if usage['languages'][0]['quantile'] < 50:
return final + ' (one of the ' + str(usage['languages'][0]['quantile']) + '% most active ' + usage['languages'][0]['language'] + ' users)'
else:
return final + ' hacker'
def habits(usage):
if usage['events'][0]['type'] in event_actions:
return 'spends a lot of time ' + event_actions[usage['events'][0]['type']] + ' between pushes'
else:
return 'loves pushing code'
def main():
raw = json.loads(urlopen("http://osrc.dfm.io/maxpowa.json").read())
print(raw)
usage = raw['usage']
print(usage)
print(format_text('maxpowa', usage))
print('done')
if __name__ == "__main__":
main()