Search in sources :

Example 1 with YouTubeChannel

use of com.sx4.bot.entities.youtube.YouTubeChannel in project Sx4 by sx4-discord-bot.

the class YouTubeNotificationCommand method preview.

@Command(value = "preview", description = "Previews your YouTube notification message")
@CommandId(465)
@Examples({ "youtube notification preview 5e45ce6d3688b30ee75201ae" })
public void preview(Sx4CommandEvent event, @Argument(value = "id") ObjectId id) {
    Document data = event.getMongo().getYouTubeNotification(Filters.and(Filters.eq("_id", id), Filters.eq("guildId", event.getGuild().getIdLong())), Projections.include("uploaderId", "message"));
    if (data == null) {
        event.replyFailure("I could not find that notification").queue();
        return;
    }
    String channelId = data.getString("uploaderId");
    Request request = new Request.Builder().url("https://www.youtube.com/feeds/videos.xml?channel_id=" + channelId).build();
    event.getHttpClient().newCall(request).enqueue((HttpCallback) response -> {
        if (response.code() == 404) {
            event.replyFailure("The YouTube channel for this notification no longer exists").queue();
            return;
        }
        JSONObject channel = XML.toJSONObject(response.body().string());
        JSONObject feed = channel.getJSONObject("feed");
        JSONArray entries = feed.optJSONArray("entry");
        YouTubeVideo video;
        if (entries == null || entries.isEmpty()) {
            OffsetDateTime now = OffsetDateTime.now(ZoneOffset.UTC);
            video = new YouTubeVideo("dQw4w9WgXcQ", "This channel had no uploads", now, now);
        } else {
            JSONObject entry = entries.getJSONObject(0);
            video = new YouTubeVideo(entry.getString("yt:videoId"), entry.getString("title"), entry.getString("updated"), entry.getString("published"));
        }
        String channelName = feed.getString("title");
        Document message = new JsonFormatter(data.get("message", YouTubeManager.DEFAULT_MESSAGE)).addVariable("video", video).addVariable("channel", new YouTubeChannel(channelId, channelName)).parse();
        try {
            MessageUtility.fromWebhookMessage(event.getTextChannel(), MessageUtility.fromJson(message).build()).queue();
        } catch (IllegalArgumentException e) {
            event.replyFailure(e.getMessage()).queue();
        }
    });
}
Also used : Document(org.bson.Document) FormatterVariable(com.sx4.bot.formatter.function.FormatterVariable) MongoWriteException(com.mongodb.MongoWriteException) Permission(net.dv8tion.jda.api.Permission) TextChannel(net.dv8tion.jda.api.entities.TextChannel) PagedResult(com.sx4.bot.paged.PagedResult) JSONObject(org.json.JSONObject) Matcher(java.util.regex.Matcher) ZoneOffset(java.time.ZoneOffset) BotPermissions(com.sx4.bot.annotations.command.BotPermissions) AuthorPermissions(com.sx4.bot.annotations.command.AuthorPermissions) ErrorResponseException(net.dv8tion.jda.api.exceptions.ErrorResponseException) Request(okhttp3.Request) HttpCallback(com.sx4.bot.http.HttpCallback) Sx4Command(com.sx4.bot.core.Sx4Command) CompletionException(java.util.concurrent.CompletionException) FormatterManager(com.sx4.bot.formatter.FormatterManager) Instant(java.time.Instant) Collectors(java.util.stream.Collectors) StandardCharsets(java.nio.charset.StandardCharsets) Examples(com.sx4.bot.annotations.command.Examples) OffsetDateTime(java.time.OffsetDateTime) YouTubeChannel(com.sx4.bot.entities.youtube.YouTubeChannel) MultipartBody(okhttp3.MultipartBody) Pattern(java.util.regex.Pattern) java.util(java.util) Command(com.jockie.bot.core.command.Command) JsonFormatter(com.sx4.bot.formatter.JsonFormatter) CommandId(com.sx4.bot.annotations.command.CommandId) CompletableFuture(java.util.concurrent.CompletableFuture) ErrorResponse(net.dv8tion.jda.api.requests.ErrorResponse) RequestBody(okhttp3.RequestBody) Bson(org.bson.conversions.Bson) AdvancedMessage(com.sx4.bot.annotations.argument.AdvancedMessage) XML(org.json.XML) Sx4CommandEvent(com.sx4.bot.core.Sx4CommandEvent) com.mongodb.client.model(com.mongodb.client.model) YouTubeManager(com.sx4.bot.managers.YouTubeManager) FutureUtility(com.sx4.bot.utility.FutureUtility) Argument(com.jockie.bot.core.argument.Argument) Operators(com.sx4.bot.database.mongo.model.Operators) MessageUtility(com.sx4.bot.utility.MessageUtility) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) ModuleCategory(com.sx4.bot.category.ModuleCategory) URLEncoder(java.net.URLEncoder) SelectType(com.sx4.bot.paged.PagedResult.SelectType) YouTubeVideo(com.sx4.bot.entities.youtube.YouTubeVideo) ImageUrl(com.sx4.bot.annotations.argument.ImageUrl) ObjectId(org.bson.types.ObjectId) ExceptionUtility(com.sx4.bot.utility.ExceptionUtility) JSONArray(org.json.JSONArray) ErrorCategory(com.mongodb.ErrorCategory) JsonFormatter(com.sx4.bot.formatter.JsonFormatter) JSONObject(org.json.JSONObject) YouTubeChannel(com.sx4.bot.entities.youtube.YouTubeChannel) OffsetDateTime(java.time.OffsetDateTime) EmbedBuilder(net.dv8tion.jda.api.EmbedBuilder) Request(okhttp3.Request) JSONArray(org.json.JSONArray) YouTubeVideo(com.sx4.bot.entities.youtube.YouTubeVideo) Document(org.bson.Document) Sx4Command(com.sx4.bot.core.Sx4Command) Command(com.jockie.bot.core.command.Command) CommandId(com.sx4.bot.annotations.command.CommandId) Examples(com.sx4.bot.annotations.command.Examples)

Example 2 with YouTubeChannel

use of com.sx4.bot.entities.youtube.YouTubeChannel in project Sx4 by sx4-discord-bot.

the class YouTubeEndpoint method postYouTube.

@POST
@Path("youtube")
public Response postYouTube(final String body) {
    JSONObject json = XML.toJSONObject(body);
    JSONObject feed = json.getJSONObject("feed");
    if (feed.has("at:deleted-entry")) {
        JSONObject entry = feed.getJSONObject("at:deleted-entry");
        JSONObject channel = entry.getJSONObject("at:by");
        String videoId = entry.getString("ref").substring(9), videoDeletedAt = entry.getString("when");
        String channelId = channel.getString("uri").substring(32), channelName = channel.getString("name");
        this.bot.getYouTubeManager().onYouTube(new YouTubeDeleteEvent(new YouTubeChannel(channelId, channelName), videoId, videoDeletedAt));
    } else {
        JSONObject entry = feed.getJSONObject("entry");
        String videoTitle = entry.getString("title"), videoId = entry.getString("yt:videoId"), videoUpdatedAt = entry.getString("updated"), videoPublishedAt = entry.getString("published");
        String channelId = entry.getString("yt:channelId"), channelName = entry.getJSONObject("author").getString("name");
        YouTubeChannel channel = new YouTubeChannel(channelId, channelName);
        YouTubeVideo video = new YouTubeVideo(videoId, videoTitle, videoUpdatedAt, videoPublishedAt);
        Document data = this.bot.getMongo().getYouTubeNotificationLog(Filters.eq("videoId", videoId), Projections.include("title"));
        String oldTitle = data == null ? null : data.getString("title");
        if (data == null && Duration.between(video.getPublishedAt(), OffsetDateTime.now(ZoneOffset.UTC)).toDays() <= 1) {
            this.bot.getYouTubeManager().onYouTube(new YouTubeUploadEvent(channel, video));
        } else if (data != null && oldTitle.equals(videoTitle)) {
            this.bot.getYouTubeManager().onYouTube(new YouTubeUpdateEvent(channel, video));
        } else {
            this.bot.getYouTubeManager().onYouTube(new YouTubeUpdateTitleEvent(channel, video, oldTitle));
        }
    }
    return Response.status(204).build();
}
Also used : JSONObject(org.json.JSONObject) YouTubeChannel(com.sx4.bot.entities.youtube.YouTubeChannel) YouTubeUpdateTitleEvent(com.sx4.bot.events.youtube.YouTubeUpdateTitleEvent) YouTubeVideo(com.sx4.bot.entities.youtube.YouTubeVideo) Document(org.bson.Document) YouTubeUploadEvent(com.sx4.bot.events.youtube.YouTubeUploadEvent) YouTubeUpdateEvent(com.sx4.bot.events.youtube.YouTubeUpdateEvent) YouTubeDeleteEvent(com.sx4.bot.events.youtube.YouTubeDeleteEvent)

Aggregations

YouTubeChannel (com.sx4.bot.entities.youtube.YouTubeChannel)2 YouTubeVideo (com.sx4.bot.entities.youtube.YouTubeVideo)2 Document (org.bson.Document)2 JSONObject (org.json.JSONObject)2 Argument (com.jockie.bot.core.argument.Argument)1 Command (com.jockie.bot.core.command.Command)1 ErrorCategory (com.mongodb.ErrorCategory)1 MongoWriteException (com.mongodb.MongoWriteException)1 com.mongodb.client.model (com.mongodb.client.model)1 AdvancedMessage (com.sx4.bot.annotations.argument.AdvancedMessage)1 ImageUrl (com.sx4.bot.annotations.argument.ImageUrl)1 AuthorPermissions (com.sx4.bot.annotations.command.AuthorPermissions)1 BotPermissions (com.sx4.bot.annotations.command.BotPermissions)1 CommandId (com.sx4.bot.annotations.command.CommandId)1 Examples (com.sx4.bot.annotations.command.Examples)1 ModuleCategory (com.sx4.bot.category.ModuleCategory)1 Sx4Command (com.sx4.bot.core.Sx4Command)1 Sx4CommandEvent (com.sx4.bot.core.Sx4CommandEvent)1 Operators (com.sx4.bot.database.mongo.model.Operators)1 YouTubeDeleteEvent (com.sx4.bot.events.youtube.YouTubeDeleteEvent)1