use of com.sx4.bot.http.HttpCallback in project Sx4 by sx4-discord-bot.
the class TwitchTokenManager method retrieveToken.
public void retrieveToken() {
Request request = new Request.Builder().post(RequestBody.create(new byte[0], null)).url("https://id.twitch.tv/oauth2/token?client_id=" + this.bot.getConfig().getTwitchClientId() + "&client_secret=" + this.bot.getConfig().getTwitchClientSecret() + "&grant_type=client_credentials").build();
this.bot.getHttpClient().newCall(request).enqueue((HttpCallback) response -> {
Document json = Document.parse(response.body().string());
this.bot.getTwitchConfig().set("token", json.getString("access_token")).set("expiresAt", Clock.systemUTC().instant().getEpochSecond() + json.getInteger("expires_in")).update();
this.schedule(json.getInteger("expires_in"));
});
}
use of com.sx4.bot.http.HttpCallback in project Sx4 by sx4-discord-bot.
the class WelcomerUtility method getWelcomerMessage.
public static void getWelcomerMessage(OkHttpClient httpClient, Document messageData, String bannerId, Member member, boolean canary, boolean image, boolean gif, BiConsumer<WebhookMessageBuilder, Throwable> consumer) {
Guild guild = member.getGuild();
User user = member.getUser();
OffsetDateTime now = OffsetDateTime.now();
Formatter<Document> formatter = new JsonFormatter(messageData).member(member).user(user).guild(guild).addVariable(User.class, "age", TimeUtility.LONG_TIME_FORMATTER.parse(Duration.between(user.getTimeCreated(), now).toSeconds())).addVariable("now", now);
if (!image) {
WebhookMessageBuilder builder;
if (messageData != null) {
try {
builder = MessageUtility.fromJson(formatter.parse());
} catch (IllegalArgumentException e) {
consumer.accept(null, e);
return;
}
} else {
builder = new WebhookMessageBuilder();
}
consumer.accept(builder, null);
} else {
ImageRequest request = new ImageRequest(Config.get().getImageWebserverUrl("welcomer")).addQuery("avatar", user.getEffectiveAvatarUrl()).addQuery("name", user.getAsTag()).addQuery("gif", gif).addQuery("directory", canary ? "sx4-canary" : "sx4-main");
if (bannerId != null) {
request.addQuery("banner_id", bannerId);
}
httpClient.newCall(request.build(Config.get().getImageWebserver())).enqueue((HttpCallback) response -> {
if (response.isSuccessful()) {
String fileName = "welcomer." + response.header("Content-Type").split("/")[1];
formatter.addVariable("file.name", fileName).addVariable("file.url", "attachment://" + fileName);
WebhookMessageBuilder builder;
if (messageData == null) {
builder = new WebhookMessageBuilder();
} else {
try {
builder = MessageUtility.fromJson(formatter.parse());
} catch (IllegalArgumentException e) {
consumer.accept(null, e);
return;
}
}
builder.addFile(fileName, response.body().bytes());
consumer.accept(builder, null);
} else {
response.close();
}
});
}
}
use of com.sx4.bot.http.HttpCallback in project Sx4 by sx4-discord-bot.
the class YouTubeNotificationCommand method add.
@Command(value = "add", description = "Add a youtube notification to be posted to a specific channel when the user uploads")
@CommandId(158)
@AuthorPermissions(permissions = { Permission.MANAGE_SERVER })
@Examples({ "youtube notification add videos mrbeast", "youtube notification add mrbeast", "youtube notification add #videos pewdiepie" })
public void add(Sx4CommandEvent event, @Argument(value = "channel", nullDefault = true) TextChannel channel, @Argument(value = "youtube channel", endless = true) String channelQuery) {
if (!event.getBot().getConnectionHandler().isReady()) {
event.replyFailure("The bot has to be fully started to use this command, try again later").queue();
return;
}
TextChannel effectiveChannel = channel == null ? event.getTextChannel() : channel;
boolean id = this.id.matcher(channelQuery).matches();
boolean search;
String queryName, query;
Matcher matcher = this.url.matcher(channelQuery);
if (!id && matcher.matches()) {
String path = matcher.group(1);
search = false;
queryName = path == null || path.equals("user") ? "forUsername" : "id";
query = matcher.group(2);
} else {
search = !id;
queryName = id ? "id" : "q";
query = channelQuery;
}
Request channelRequest = new Request.Builder().url("https://www.googleapis.com/youtube/v3/" + (search ? "search" : "channels") + "?key=" + event.getConfig().getYouTube() + "&" + queryName + "=" + URLEncoder.encode(query, StandardCharsets.UTF_8) + "&part=snippet&type=channel&maxResults=1").build();
event.getHttpClient().newCall(channelRequest).enqueue((HttpCallback) channelResponse -> {
Document json = Document.parse(channelResponse.body().string());
List<Document> items = json.getList("items", Document.class, Collections.emptyList());
if (items.isEmpty()) {
event.replyFailure("I could not find that youtube channel").queue();
return;
}
Document item = items.get(0);
String channelId = search ? item.getEmbedded(List.of("id", "channelId"), String.class) : item.getString("id");
Document notificationData = new Document("uploaderId", channelId).append("channelId", effectiveChannel.getIdLong()).append("guildId", event.getGuild().getIdLong());
if (!event.getBot().getYouTubeManager().hasExecutor(channelId)) {
RequestBody body = new MultipartBody.Builder().addFormDataPart("hub.mode", "subscribe").addFormDataPart("hub.topic", "https://www.youtube.com/xml/feeds/videos.xml?channel_id=" + channelId).addFormDataPart("hub.callback", event.getConfig().getBaseUrl() + "/api/youtube").addFormDataPart("hub.verify", "sync").addFormDataPart("hub.verify_token", event.getConfig().getYouTube()).setType(MultipartBody.FORM).build();
Request request = new Request.Builder().url("https://pubsubhubbub.appspot.com/subscribe").post(body).build();
event.getHttpClient().newCall(request).enqueue((HttpCallback) response -> {
if (response.isSuccessful()) {
event.getMongo().insertYouTubeNotification(notificationData).whenComplete((result, exception) -> {
Throwable cause = exception instanceof CompletionException ? exception.getCause() : exception;
if (cause instanceof MongoWriteException && ((MongoWriteException) cause).getError().getCategory() == ErrorCategory.DUPLICATE_KEY) {
event.replyFailure("You already have a notification setup for that youtube channel in " + effectiveChannel.getAsMention()).queue();
return;
}
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
event.replyFormat("Notifications will now be sent in %s when **%s** uploads with id `%s` %s", effectiveChannel.getAsMention(), item.getEmbedded(List.of("snippet", "title"), String.class), result.getInsertedId().asObjectId().getValue().toHexString(), event.getConfig().getSuccessEmote()).queue();
});
} else {
event.replyFailure("Oops something went wrong there, try again. If this repeats report this to my developer (Message: " + response.body().string() + ")").queue();
}
});
} else {
event.getMongo().insertYouTubeNotification(notificationData).whenComplete((result, exception) -> {
Throwable cause = exception instanceof CompletionException ? exception.getCause() : exception;
if (cause instanceof MongoWriteException && ((MongoWriteException) cause).getError().getCategory() == ErrorCategory.DUPLICATE_KEY) {
event.replyFailure("You already have a notification setup for that youtube channel in " + effectiveChannel.getAsMention()).queue();
return;
}
if (ExceptionUtility.sendExceptionally(event, exception)) {
return;
}
event.replyFormat("Notifications will now be sent in %s when **%s** uploads with id `%s` %s", effectiveChannel.getAsMention(), item.getEmbedded(List.of("snippet", "title"), String.class), result.getInsertedId().asObjectId().getValue().toHexString(), event.getConfig().getSuccessEmote()).queue();
});
}
});
}
use of com.sx4.bot.http.HttpCallback in project Sx4 by sx4-discord-bot.
the class SteamCommand method game.
@Command(value = "profile", description = "Look up information about a steam profile")
@CommandId(212)
@Examples({ "steam profile dog", "steam profile https://steamcommunity.com/id/dog" })
@BotPermissions(permissions = { Permission.MESSAGE_EMBED_LINKS })
public void game(Sx4CommandEvent event, @Argument(value = "query", endless = true, nullDefault = true) String query) {
List<Document> profiles;
if (query == null) {
List<Document> connections = event.getMongo().getUserById(event.getAuthor().getIdLong(), Projections.include("connections.steam")).getEmbedded(List.of("connections", "steam"), Collections.emptyList());
if (connections.isEmpty()) {
event.replyFailure("You do not have a steam account linked, use `steam connect` to link an account or provide an argument to search").queue();
return;
}
profiles = connections.stream().map(data -> data.append("url", "https://steamcommunity.com/profiles/" + data.getLong("id"))).collect(Collectors.toList());
} else {
profiles = List.of(new Document("url", this.getProfileUrl(query)));
}
PagedResult<Document> paged = new PagedResult<>(event.getBot(), profiles).setAutoSelect(true).setAuthor("Steam Profiles", null, "https://upload.wikimedia.org/wikipedia/commons/thumb/8/83/Steam_icon_logo.svg/2000px-Steam_icon_logo.svg.png").setDisplayFunction(data -> "[" + data.getString("name") + "](" + data.getString("url") + ")");
paged.onSelect(select -> {
String url = select.getSelected().getString("url");
Request request = new Request.Builder().url(url + "?xml=1").build();
event.getHttpClient().newCall(request).enqueue((HttpCallback) response -> {
JSONObject json = XML.toJSONObject(response.body().string());
if (json.has("response")) {
event.replyFailure("I could not find that steam user").queue();
return;
}
JSONObject profile = json.getJSONObject("profile");
if (profile.getInt("visibilityState") == 1) {
event.replyFailure("That profile is private").queue();
return;
}
JSONObject mostPlayedGames = profile.optJSONObject("mostPlayedGames");
JSONArray gamesArray = mostPlayedGames == null ? new JSONArray() : mostPlayedGames.optJSONArray("mostPlayedGame");
if (gamesArray == null) {
gamesArray = new JSONArray().put(mostPlayedGames.getJSONObject("mostPlayedGame"));
}
double hours = 0D;
StringBuilder gamesString = new StringBuilder();
for (int i = 0; i < gamesArray.length(); i++) {
JSONObject game = gamesArray.getJSONObject(i);
hours += game.getDouble("hoursPlayed");
gamesString.append(String.format("[%s](%s) - **%.1f** hours\n", game.getString("gameName"), game.getString("gameLink"), game.getDouble("hoursPlayed")));
}
String stateMessage = profile.getString("stateMessage");
String location = profile.getString("location");
String realName = profile.getString("realname");
EmbedBuilder embed = new EmbedBuilder();
embed.setAuthor(profile.getString("steamID"), url, profile.getString("avatarFull"));
embed.setDescription(Jsoup.parse(profile.getString("summary")).text());
embed.setFooter("ID: " + profile.getLong("steamID64"));
embed.setThumbnail(profile.getString("avatarFull"));
embed.addField("Real Name", realName.isBlank() ? "None Given" : realName, true);
embed.addField("Created At", LocalDate.parse(profile.getString("memberSince"), DateTimeFormatter.ofPattern("LLLL d, yyyy")).format(this.formatter), true);
embed.addField("Status", StringUtility.title(profile.getString("onlineState")), true);
embed.addField("State Message", Jsoup.parse(stateMessage).text(), true);
embed.addField("Vac Bans", String.valueOf(profile.getInt("vacBanned")), true);
if (!location.isBlank()) {
embed.addField("Location", location, true);
}
if (hours != 0) {
gamesString.append(String.format("\nTotal - **%.1f** hours", hours));
embed.addField("Games Played (2 Weeks)", gamesString.toString(), false);
}
event.reply(embed.build()).queue();
});
});
paged.execute(event);
}
use of com.sx4.bot.http.HttpCallback in project Sx4 by sx4-discord-bot.
the class EmoteCommand method getBytes.
private void getBytes(OkHttpClient httpClient, String url, TriConsumer<byte[], Boolean, Integer> bytes) {
Request request = new Request.Builder().url(RequestUtility.getWorkerUrl(url)).build();
httpClient.newCall(request).enqueue((HttpCallback) response -> {
if (response.code() == 200) {
String contentType = response.header("Content-Type"), extension = null;
if (contentType != null && contentType.contains("/")) {
extension = contentType.split("/")[1].toLowerCase();
}
bytes.accept(response.body().bytes(), extension == null ? null : extension.equals("gif"), 200);
return;
} else if (response.code() == 415) {
int periodIndex = url.lastIndexOf('.');
if (periodIndex != -1) {
String extension = url.substring(periodIndex + 1);
if (extension.equalsIgnoreCase("gif")) {
this.getBytes(httpClient, url.substring(0, periodIndex + 1) + "png", bytes);
return;
}
}
}
bytes.accept(null, null, response.code());
});
}
Aggregations