@Override
public void execute(Update update) {
String chatId = update.getMessage().getChatId().toString();
telegramUserService.findByChatId(chatId).ifPresentOrElse(
user -> {
user.setActive(true);
telegramUserService.save(user);
},
() -> {
TelegramUser telegramUser = new TelegramUser();
telegramUser.setActive(true);
telegramUser.setChatId(chatId);
telegramUserService.save(telegramUser);
});
sendBotMessageService.sendMessage(chatId, START_MESSAGE);
}
La logique fonctionne ici : si notre base de données a déjà un tel utilisateur par chatId, nous définissons simplement le champ active = true pour lui. Et s'il n'y a pas un tel utilisateur, nous en créons un nouveau. Idem pour la commande /stop dans StopCommand :
@Override
public void execute(Update update) {
telegramUserService.findByChatId(update.getMessage().getChatId().toString())
.ifPresent(it -> {
it.setActive(false);
telegramUserService.save(it);
});
sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), STOP_MESSAGE);
}
On peut voir que lors de l'appel de cette commande, seul le champ active = false est défini pour l'utilisateur. Et c’est tout : ses abonnements vivront et attendront en coulisses lorsque l’utilisateur décidera à nouveau d’activer le chat avec le bot. Et il semblerait que la tâche soit déjà terminée et puisse être clôturée. Mais ce n'était pas là. La tâche la plus importante est de créer une alerte sur les nouveaux articles de l'abonnement. C'est ici que ces tâches seront complètement mises à jour et complétées. Autrement dit, jusqu'à ce que nous ayons mis en place la notification des nouveaux articles, il ne peut pas être fermé. Par conséquent, occupons-nous de la tâche JRTB-4 - créer un contrôle toutes les 20 minutes et des notifications sur les nouveaux articles. Amis! Voulez-vous savoir immédiatement quand le nouveau code du projet est publié ? Quand sort un nouvel article ? Rejoignez ma chaîne tg . Là, je rassemble mes articles, mes réflexions, mes développements open source.
Nous implémentons JRTB-4
Ce que nous devons faire dans le cadre de cette tâche :-
Créez un travail qui ira périodiquement à tous les groupes pour lesquels nous avons des abonnements dans la base de données, triera les articles par date de publication et vérifiera si l'ID de la dernière publication correspond à la valeur dans GroupSub. Si cela ne correspond pas, vous devez alors comprendre exactement combien d’articles ont été publiés depuis la dernière fois. Nous mettons à jour last_article_id dans GroupSub7 vers l'état actuel.
-
Lorsque nous avons trouvé une liste d'articles publiés, nous trouvons tous les utilisateurs ACTIFS de ces groupes et leur envoyons des notifications sur les nouveaux articles.
Nous écrivons JavaRushPostClient
Ici, nous n'essaierons pas de couvrir toutes les requêtes qui nous ont été envoyées dans l'API et créerons uniquement celle dont nous avons besoin. En faisant cela, nous atteignons deux objectifs à la fois :-
Nous accélérons le processus de rédaction de notre candidature.
-
Nous laissons ce travail à ceux qui veulent aider notre communauté et décidons de s'essayer en tant que développeur. Je ferai des tâches pour cela qui pourront être accomplies après le MVP.
Informations utilisateur de base :
package com.github.javarushcommunity.jrtb.javarushclient.dto;
import lombok.Data;
/**
* DTO, which represents base user information.
*/
@Data
public class BaseUserInfo {
private String city;
private String country;
private String displayName;
private Integer id;
private String job;
private String key;
private Integer level;
private String pictureUrl;
private String position;
private UserPublicStatus publicStatus;
private String publicStatusMessage;
private Integer rating;
private Integer userId;
}
Langue:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents languages.
*/
public enum Language {
UNKNOWN,
ENGLISH,
GERMAN,
SPANISH,
HINDI,
FRENCH,
PORTUGUESE,
POLISH,
BENGALI,
PUNJABI,
CHINESE,
ITALIAN,
INDONESIAN,
MARATHI,
TAMIL,
TELUGU,
JAPANESE,
KOREAN,
URDU,
TAIWANESE,
NETHERLANDS,
RUSSIAN,
UKRAINIAN
}
J'aimeInfo :
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents like's information.
*/
public class LikesInfo {
private Integer count;
private LikeStatus status;
}
J'aimeStatut :
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents like's status.
*/
public enum LikeStatus {
UNKNOWN,
LIKE,
HOT,
FOLLOW,
FAVORITE,
SOLUTION,
HELPFUL,
ARTICLE,
OSCAR,
DISLIKE,
WRONG,
SPAM,
ABUSE,
FOUL,
TROLLING,
OFFTOPIC,
DUPLICATE,
DIRTY,
OUTDATED,
BORING,
UNCLEAR,
HARD,
EASY,
FAKE,
SHAM,
AWFUL
}
Type de poste:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents post types.
*/
public enum PostType {
UNKNOWN, USUAL, INNER_LINK, OUTER_LINK
}
Statut public utilisateur :
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents user public status.
*/
public enum UserPublicStatus {
UNKNOWN,
BEGINNER,
ACTIVE,
STRONG,
GRADUATED,
INTERNSHIP_IN_PROGRESS,
INTERNSHIP_COMPLETED,
RESUME_COMPLETED,
LOOKING_FOR_JOB,
HAVE_JOB;
}
VisibilityStatus:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents visibility status.
*/
public enum VisibilityStatus {
UNKNOWN,
RESTRICTED,
PUBLIC,
PROTECTED,
PRIVATE,
DISABLED,
DELETED
}
Sur la base de tous ces DTO, écrivons une classe principale pour recevoir des articles :
Informations sur le message :
package com.github.javarushcommunity.jrtb.javarushclient.dto;
import lombok.Data;
/**
* DTO, which represents post information.
*/
@Data
public class PostInfo {
private BaseUserInfo authorInfo;
private Integer commentsCount;
private String content;
private Long createdTime;
private String description;
private GroupInfo groupInfo;
private Integer id;
private String key;
private Language language;
private LikesInfo likesInfo;
private GroupInfo originalGroupInfo;
private String pictureUrl;
private Double rating;
private Integer ratingCount;
private String title;
private PostType type;
private Long updatedTime;
private UserDiscussionInfo userDiscussionInfo;
private Integer views;
private VisibilityStatus visibilityStatus;
}
Créons maintenant une interface avec laquelle travailler et son implémentation. Nous n'aurons besoin que d'une seule méthode pour travailler avec des articles :
JavaRushPostClient :
package com.github.javarushcommunity.jrtb.javarushclient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.PostInfo;
import java.util.List;
/**
* Client for Javarush Open API corresponds to Posts.
*/
public interface JavaRushPostClient {
/**
* Find new posts since lastPostId in provided group.
*
* @param groupId provided group ID.
* @param lastPostId provided last post ID.
* @return the collection of the new {@link PostInfo}.
*/
List<PostInfo> findNewPosts(Integer groupId, Integer lastPostId);
}
findNewPosts prend deux arguments : l'ID du groupe et le dernier ID de l'article que le bot a déjà publié. Par conséquent, tous les articles publiés après l'article avec lastPostId seront transmis . Et sa mise en œuvre :
package com.github.javarushcommunity.jrtb.javarushclient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.PostInfo;
import kong.unirest.GenericType;
import kong.unirest.Unirest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List;
@Component
public class JavaRushPostClientImpl implements JavaRushPostClient {
private final String javarushApiPostPath;
public JavaRushPostClientImpl(@Value("${javarush.api.path}") String javarushApi) {
this.javarushApiPostPath = javarushApi + "/posts";
}
@Override
public List<PostInfo> findNewPosts(Integer groupId, Integer lastPostId) {
List<PostInfo> lastPostsByGroup = Unirest.get(javarushApiPostPath)
.queryString("order", "NEW")
.queryString("groupKid", groupId)
.queryString("limit", 15)
.asObject(new GenericType<List<PostInfo>>() {
}).getBody();
List<PostInfo> newPosts = new ArrayList<>();
for (PostInfo post : lastPostsByGroup) {
if (lastPostId.equals(post.getId())) {
return newPosts;
}
newPosts.add(post);
}
return newPosts;
}
}
Nous ajoutons plusieurs filtres à la requête :
- order = NEW - pour que la liste contienne d'abord les nouveaux ;
- groupKid = groupId - recherche uniquement certains groupes ;
- limit = 15 — nous limitons le nombre d'articles par demande. Notre fréquence est de 15 à 20 minutes et nous prévoyons que pendant cette période, pas PLUS de 15 (!) seront écrits.
package com.github.javarushcommunity.jrtb.javarushclient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.PostInfo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.util.List;
import static com.github.javarushcommunity.jrtb.javarushclient.JavaRushGroupClientTest.JAVARUSH_API_PATH;
@DisplayName("Integration-level testing for JavaRushPostClient")
class JavaRushPostClientTest {
private final JavaRushPostClient postClient = new JavaRushPostClientImpl(JAVARUSH_API_PATH);
@Test
public void shouldProperlyGetNew15Posts() {
//when
List<PostInfo> newPosts = postClient.findNewPosts(30, 2935);
//then
Assertions.assertEquals(15, newPosts.size());
}
}
Il s'agit d'un test très simple qui vérifie s'il y a ou non une communication avec le client. Il trouve 15 nouveaux articles dans le groupe des projets Java, car je lui donne l'identifiant du premier article de ce groupe, et il y en a déjà plus de 15... Il y en a déjà 22 ! Je ne pensais même pas qu'il y en aurait autant. Comment l’ai-je su rapidement ? Pensez-vous qu'il est allé les compter ? Non) J'ai utilisé un swager et j'ai regardé le nombre d'articles pour un certain groupe. D'ailleurs, vous pouvez regarder de cette façon chez les autres... Et combien d'articles y a-t-il dans le groupe RANDOM ?... Je vais vous le dire maintenant : il y en a 1062 ! Montant sérieux.
GO TO FULL VERSION