@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);
}
Logic hoạt động ở đây: nếu cơ sở dữ liệu của chúng tôi đã có một người dùng như vậy bằng chatId, chúng tôi chỉ cần đặt trường active = true cho anh ấy. Và nếu không có người dùng như vậy, chúng tôi sẽ tạo một người dùng mới. Tương tự với lệnh /stop trong 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);
}
Có thể thấy khi gọi lệnh này chỉ có trường active = false được đặt cho người dùng. Và đó là tất cả: các đăng ký của anh ấy sẽ tồn tại và chờ đợi khi người dùng quyết định kích hoạt lại cuộc trò chuyện với bot. Và có vẻ như nhiệm vụ đã hoàn thành và có thể đóng lại. Nhưng nó không có ở đó. Nhiệm vụ quan trọng nhất là tạo thông báo về các bài viết mới trong mục đăng ký. Đây là nơi các nhiệm vụ này sẽ được cập nhật và hoàn thành đầy đủ. Tức là cho đến khi chúng tôi triển khai thông báo bài viết mới thì không thể đóng được. Vì vậy, hãy đảm nhiệm nhiệm vụ JRTB-4 - tạo kiểm tra 20 phút một lần và thông báo về các bài viết mới. Bạn! Bạn có muốn biết ngay khi nào mã mới cho dự án được phát hành không? Khi nào có bài viết mới? Tham gia kênh tg của tôi . Ở đó tôi thu thập các bài viết, suy nghĩ, sự phát triển nguồn mở của mình cùng nhau.
Chúng tôi triển khai JRTB-4
Những gì chúng ta cần làm như một phần của nhiệm vụ này:-
Tạo một công việc sẽ truy cập định kỳ tất cả các nhóm mà chúng tôi đăng ký trong cơ sở dữ liệu, sắp xếp các bài viết theo ngày xuất bản và kiểm tra xem ID của ấn phẩm cuối cùng có khớp với giá trị trong GroupSub hay không. Nếu nó không khớp thì bạn cần biết chính xác có bao nhiêu bài viết đã được xuất bản kể từ lần trước. Chúng tôi cập nhật Last_article_id trong GroupSub7 về trạng thái hiện tại.
-
Khi chúng tôi tìm thấy danh sách các bài viết đã xuất bản, chúng tôi sẽ tìm tất cả người dùng HOẠT ĐỘNG của các nhóm này và gửi cho họ thông báo về các bài viết mới.
Chúng tôi viết JavaRushPostClient
Ở đây, chúng tôi sẽ không cố gắng đáp ứng tất cả các yêu cầu đã được gửi cho chúng tôi trong API và sẽ chỉ tạo yêu cầu mà chúng tôi cần. Bằng cách này, chúng tôi đạt được hai mục tiêu cùng một lúc:-
Chúng tôi tăng tốc quá trình viết ứng dụng của chúng tôi.
-
Chúng tôi giao công việc này cho những người muốn giúp đỡ cộng đồng của chúng tôi và quyết định thử sức mình với tư cách là một nhà phát triển. Tôi sẽ thực hiện các nhiệm vụ có thể hoàn thành sau MVP.
Thông tin người dùng cơ sở:
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;
}
Ngôn ngữ:
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
}
Thông tin lượt thích:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents like's information.
*/
public class LikesInfo {
private Integer count;
private LikeStatus status;
}
Trạng thái thích:
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
}
Loại thư:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents post types.
*/
public enum PostType {
UNKNOWN, USUAL, INNER_LINK, OUTER_LINK
}
Trạng thái công khai của người dùng:
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
}
Dựa trên tất cả các DTO này, hãy viết một lớp chính để nhận bài viết:
Thông tin bài viết:
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;
}
Bây giờ hãy tạo một giao diện để làm việc và cách triển khai nó. Chúng ta sẽ chỉ cần một phương pháp để làm việc với bài viết:
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 nhận hai đối số: ID nhóm và ID cuối cùng của bài viết mà bot đã đăng. Do đó, tất cả những bài viết được xuất bản muộn hơn bài viết có LastPostId sẽ được truyền đi . Và việc thực hiện nó:
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;
}
}
Chúng tôi thêm một số bộ lọc vào yêu cầu:
- order = NEW - để danh sách chứa những cái mới trước;
- groupKid = groupId - chỉ tìm kiếm các nhóm nhất định;
- limit = 15 — chúng tôi giới hạn số lượng bài viết cho mỗi yêu cầu. Tần suất của chúng tôi là 15-20 phút và chúng tôi hy vọng rằng trong thời gian này sẽ không viết QUÁ 15 (!)
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());
}
}
Đây là một thử nghiệm rất đơn giản để kiểm tra xem có bất kỳ giao tiếp nào với khách hàng hay không. Anh ta tìm thấy 15 bài viết mới trong nhóm dự án Java, bởi vì tôi đưa cho anh ta ID của bài viết đầu tiên trong nhóm này, và đã có hơn 15 bài viết trong số đó... Đã có 22 bài trong số đó! Tôi thậm chí còn không nghĩ rằng sẽ có nhiều người như vậy. Làm thế nào tôi phát hiện ra một cách nhanh chóng? Bạn có nghĩ rằng anh ấy đã đi đếm chúng? Không) Tôi đã sử dụng một công cụ chuyển đổi và xem xét số lượng bài viết của một nhóm nhất định. Nhân tiện, bạn có thể xem xét những người khác theo cách này... Và có bao nhiêu bài viết trong nhóm RANDOM?... Bây giờ tôi sẽ nói cho bạn biết: có 1062 bài trong số đó! Số lượng nghiêm trọng.
GO TO FULL VERSION