/
UserRepDiffTask.groovy
81 lines (69 loc) · 2.68 KB
/
UserRepDiffTask.groovy
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
package net.zomis.duga.tasks
import net.zomis.duga.DugaBot
import net.zomis.duga.StackExchangeAPI
import net.zomis.duga.chat.WebhookParameters;
import java.util.function.ToIntFunction;
class UserRepDiffTask implements Runnable {
private final StackExchangeAPI stackApi;
private final DugaBot chatBot;
private final String usersString;
private final String site;
private final WebhookParameters room;
public UserRepDiffTask(StackExchangeAPI stackApi, String room, DugaBot chatBot, String users, String site) {
this.stackApi = stackApi;
this.chatBot = chatBot;
this.usersString = users.replace(',', ';');
this.room = WebhookParameters.toRoom(room);
this.site = site;
}
@Override
public void run() {
try {
def result = stackApi.apiCall("users/" + usersString, site, "!23IYXA.sS8.otifg5Aq.2");
List users = result.items
if (users.size() != 2) {
throw new UnsupportedOperationException("Cannot check diff for anything other than two users");
}
def max = users.stream().max(Comparator.comparingInt({it.reputation})).get();
def min = users.stream().min(Comparator.comparingInt({it.reputation})).get();
StringBuilder str = new StringBuilder();
str.append(clearName(max.display_name) + " vs. " + clearName(min.display_name) + ": ");
str.append((int)max.reputation - (int)min.reputation);
str.append(" diff. ");
diffStr(str, max, min, "Year", {it.reputation_change_year});
diffStr(str, max, min, "Quarter", {it.reputation_change_quarter});
diffStr(str, max, min, "Month", {it.reputation_change_month});
diffStr(str, max, min, "Week", {it.reputation_change_week});
diffStr(str, max, min, "Day", {it.reputation_change_day});
chatBot.postSingle(room, str.toString());
} catch (IOException e) {
e.printStackTrace();
}
}
public static String chatName(String displayName) {
return clearName(displayName).replace(" ", "");
}
public static String clearName(String displayName) {
while (displayName.contains("&#")) {
String replacement = displayName.substring(displayName.indexOf("&#") + 2);
try {
replacement = replacement.substring(0, replacement.indexOf(';'));
int ch = Integer.parseInt(replacement);
displayName = displayName.replaceFirst("&#\\d+;", String.valueOf((char) ch));
} catch (RuntimeException ex) {
displayName = displayName.replaceFirst("&#", "");
}
}
return displayName;
}
private void diffStr(StringBuilder str, max, min, String string, ToIntFunction<?> function) {
str.append(string);
str.append(": ");
int maxValue = function.applyAsInt(max);
int minValue = function.applyAsInt(min);
int diff = maxValue - minValue;
str.append(diff > 0 ? "+" : "");
str.append(diff);
str.append(". ");
}
}