package discord.jar;
import java.util.*;
import org.json.JSONArray;
import org.json.JSONObject;
public class ReadyPoll implements Poll {
private Thread thread;
private DiscordAPIImpl api;
public ReadyPoll(DiscordAPIImpl api) {
this.api = api;
}
@Override
public void process(JSONObject content, JSONObject rawRequest, Server server) {
if (api.isLoaded())
return; //we reconnected
SelfData data = new SelfData();
JSONObject userDataJson = content.getJSONObject("user");
data.setUsername(userDataJson.getString("username"));
data.setId(userDataJson.getString("id"));
data.setAvatar("https://cdn.discordapp.com/avatars/" + data.getId() + "/" + (userDataJson.isNull("avatar") ?
"" : userDataJson.getString("avatar")) + ".jpg");
data.setAvatarId((userDataJson.isNull("avatar") ? "" : userDataJson.getString("avatar")));
api.setSelfInfo(data);
thread = new Thread(() ->
{
while (api.getRequestManager().getSocketClient().getConnection().isOpen()) {
api.getRequestManager().getSocketClient().send(new JSONObject().put("op", 1).put("d", System
.currentTimeMillis()).toString());
try {
Thread.sleep(content.getLong("heartbeat_interval"));
} catch (InterruptedException e) {}
}
});
thread.start();
setupServers(content);
setupContacts(content);
new Thread() {
public void run() {
try {
Thread.sleep(500);
api.getEventManager().executeEvent(new APILoadedEvent());
} catch (Exception e) {
}
}
}.start();
}
public void setupContacts(JSONObject key) {
JSONArray array = key.getJSONArray("private_channels");
for (int i = 0; i < array.length(); i++) {
JSONObject item = array.getJSONObject(i);
JSONObject contact = item.getJSONObject("recipient");
String id = contact.getString("id");
if (item.getString("id").equals(api.getSelfInfo().getId()))
api.setAs(contact.getString("id"));
UserImpl userImpl = new UserImpl(contact.getString("username"), id, item.getString("id"), api);
userImpl.setAvatar(contact.isNull("avatar") ? "" : "https://cdn.discordapp.com/avatars/" + id + "/" +
contact.getString("avatar") + ".jpg");
userImpl.setAvatarId(contact.isNull("avatar") ? "" : userImpl.getId());
api.getAvailableDms().add(userImpl);
}
}
public List<GroupUser> getGroupUsersFromJson(JSONObject obj, Map<String, String> roles) {
JSONArray members = obj.getJSONArray("members");
List<GroupUser> guList = new ArrayList<>();
for (int i = 0; i < members.length(); i++) {
JSONObject item = members.getJSONObject(i);
JSONObject user = item.getJSONObject("user");
String username = user.getString("username");
String id = user.getString("id");
String dis = String.valueOf(user.get("discriminator")); //Sometimes returns an int or string... just cast
// the obj to string
String avatarId = (user.isNull("avatar") ? "" : user.getString("avatar"));
String role = "User";
UserImpl userImpl;
if (api.isUserKnown(id)) {
userImpl = (UserImpl) api.getUserById(id);
} else {
userImpl = new UserImpl(username, id, id, api);
userImpl.setAvatar(user.isNull("avatar") ? "" : "https://cdn.discordapp.com/avatars/" + id + "/" +
avatarId + ".jpg");
}
if (item.getJSONArray("roles").length() > 0)
role = roles.get(item.getJSONArray("roles").opt(0));
guList.add(new GroupUser(userImpl, role, dis));
}
return guList;
}
public List<GroupUser> updateOnlineStatus(List<GroupUser> users, JSONArray presences) {
for (int i = 0; i < presences.length(); i++) {
JSONObject item = presences.getJSONObject(i);
for (GroupUser gUser : users) {
User user = gUser.getUser();
if (user.equals(item.getJSONObject("user").getString("id"))) {
String game = item.isNull("game_id") ? "ready to play" : GameIdUtils.getGameFromId(item.getInt
("game_id"));
OnlineStatus status = OnlineStatus.fromName(item.getString("status"));
((UserImpl) user).setGame(game);
((UserImpl) user).setOnlineStatus(status);
}
}
}
return users;
}
public HashMap<String, String> getRoles(JSONArray rolesArray) {
HashMap<String, String> roles = new HashMap<>();
for (int i = 0; i < rolesArray.length(); i++) {
JSONObject roleObj = rolesArray.getJSONObject(i);
roles.put(roleObj.getString("id"), roleObj.getString("name"));
}
return roles;
}
public void setupServers(JSONObject key) {
JSONArray guilds = key.getJSONArray("guilds");
for (int i = 0; i < guilds.length(); i++) {
JSONObject item = guilds.getJSONObject(i);
api.getUnavailableServers().add(item.getString("id"));
}
}
public void stop() {
if (thread != null)
thread.interrupt();
}
}