@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);
}
Logiknya berfungsi di sini: jika pangkalan data kami sudah mempunyai pengguna sedemikian melalui chatId, kami hanya menetapkan medan aktif = benar untuknya. Dan jika tiada pengguna sedemikian, kami mencipta pengguna baharu. Sama untuk arahan /stop dalam 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);
}
Ia boleh dilihat bahawa apabila memanggil arahan ini, hanya medan aktif = palsu ditetapkan untuk pengguna. Dan itu sahaja: langganannya akan hidup dan menunggu apabila pengguna sekali lagi memutuskan untuk mengaktifkan sembang dengan bot. Dan nampaknya tugas itu telah pun selesai dan boleh ditutup. Tetapi ia tidak ada di sana. Tugas yang paling penting ialah membuat makluman tentang artikel baharu dalam langganan. Di sinilah tugasan ini akan dikemas kini dan diselesaikan sepenuhnya. Iaitu, sehingga kami melaksanakan pemberitahuan artikel baharu, ia tidak boleh ditutup. Oleh itu, mari kita uruskan tugas JRTB-4 - membuat semakan setiap 20 minit dan pemberitahuan tentang artikel baharu. Kawan-kawan! Adakah anda ingin mengetahui dengan segera apabila kod baharu untuk projek itu dikeluarkan? Bilakah artikel baru keluar? Sertai saluran tg saya . Di sana saya mengumpulkan artikel saya, pemikiran saya, pembangunan sumber terbuka saya bersama-sama.
Kami melaksanakan JRTB-4
Apa yang perlu kita lakukan sebagai sebahagian daripada tugas ini:-
Buat kerja yang secara berkala akan melawati semua kumpulan yang kami mempunyai langganan dalam pangkalan data, mengisih artikel mengikut tarikh penerbitan dan semak sama ada ID penerbitan terakhir sepadan dengan nilai dalam GroupSub. Jika ia tidak sepadan, maka anda perlu memahami dengan tepat berapa banyak artikel telah diterbitkan sejak kali terakhir. Kami mengemas kini last_article_id dalam GroupSub7 kepada keadaan semasa.
-
Apabila kami telah menemui senarai artikel yang diterbitkan, kami menemui semua pengguna AKTIF untuk kumpulan ini dan menghantar pemberitahuan kepada mereka tentang artikel baharu.
Kami menulis JavaRushPostClient
Di sini kami tidak akan cuba untuk menampung semua permintaan yang dihantar kepada kami dalam API dan hanya akan mencipta permintaan yang kami perlukan. Dengan melakukan ini, kami mencapai dua matlamat sekaligus:-
Kami mempercepatkan proses menulis permohonan kami.
-
Kami menyerahkan kerja ini kepada mereka yang ingin membantu komuniti kami dan memutuskan untuk mencuba diri mereka sebagai pembangun. Saya akan membuat tugasan untuk ini yang boleh diselesaikan selepas MVP.
BaseUserInfo:
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;
}
Bahasa:
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
}
LikesInfo:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents like's information.
*/
public class LikesInfo {
private Integer count;
private LikeStatus status;
}
LikeStatus:
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
}
PostType:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents post types.
*/
public enum PostType {
UNKNOWN, USUAL, INNER_LINK, OUTER_LINK
}
UserPublicStatus:
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
}
Berdasarkan semua DTO ini, mari kita tulis kelas utama untuk menerima artikel:
Maklumat Pos:
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;
}
Sekarang mari kita cipta antara muka untuk digunakan dan pelaksanaannya. Kami hanya memerlukan satu kaedah untuk bekerja dengan artikel:
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 mengambil dua hujah: ID kumpulan dan ID terakhir artikel yang telah disiarkan oleh bot. Oleh itu, semua artikel yang diterbitkan lewat daripada artikel dengan lastPostId akan dihantar . Dan pelaksanaannya:
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;
}
}
Kami menambah beberapa penapis pada permintaan:
- pesanan = BARU - supaya senarai mengandungi yang baru dahulu;
- groupKid = groupId - cari hanya untuk kumpulan tertentu;
- had = 15 — kami mengehadkan bilangan artikel setiap permintaan. Kekerapan kami ialah 15-20 minit dan kami menjangkakan bahawa pada masa ini tidak LEBIH daripada 15 (!) akan ditulis.
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());
}
}
Ini adalah ujian yang sangat mudah yang memeriksa sama ada terdapat sebarang komunikasi dengan pelanggan sama sekali atau tidak. Dia menemui 15 artikel baharu dalam kumpulan projek Java, kerana saya memberinya ID artikel pertama dalam kumpulan ini, dan sudah ada lebih daripada 15 daripadanya... Sudah ada 22 daripadanya! Saya tidak menyangka akan ada begitu ramai daripada mereka. Bagaimana saya mengetahui dengan cepat? Adakah anda fikir dia pergi untuk mengira mereka? Tidak) Saya menggunakan swager dan melihat jumlah artikel untuk kumpulan tertentu. Ngomong-ngomong, anda boleh melihat cara ini pada orang lain... Dan berapa banyak artikel dalam kumpulan RANDOM?... Saya akan memberitahu anda sekarang: terdapat 1062 daripadanya! Jumlah yang serius.
GO TO FULL VERSION