@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);
}
Logikanya berfungsi di sini: jika database kami sudah memiliki pengguna seperti itu berdasarkan chatId, kami cukup menyetel bidang active = true untuknya. Dan jika tidak ada pengguna seperti itu, kami membuat yang baru. Sama untuk perintah /stop di 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);
}
Terlihat bahwa saat memanggil perintah ini, hanya kolom active = false yang disetel untuk pengguna. Dan itu saja: langganannya akan aktif dan menunggu saat pengguna kembali memutuskan untuk mengaktifkan obrolan dengan bot. Dan sepertinya tugas tersebut sudah selesai dan bisa ditutup. Tapi itu tidak ada di sana. Tugas paling penting adalah membuat pemberitahuan tentang artikel baru di langganan. Di sinilah tugas-tugas ini akan diperbarui dan diselesaikan sepenuhnya. Artinya, sampai kita menerapkan notifikasi artikel baru, tidak bisa ditutup. Oleh karena itu, mari kita selesaikan tugas JRTB-4 - membuat cek setiap 20 menit dan pemberitahuan tentang artikel baru. Teman-teman! Apakah Anda ingin segera mengetahui kapan kode baru untuk proyek tersebut dirilis? Kapan artikel baru keluar? Bergabunglah dengan saluran tg saya . Di sana saya mengumpulkan artikel saya, pemikiran saya, pengembangan sumber terbuka saya bersama.
Kami menerapkan JRTB-4
Apa yang perlu kita lakukan sebagai bagian dari tugas ini:-
Buat pekerjaan yang secara berkala akan mengunjungi semua grup tempat kita berlangganan di database, mengurutkan artikel berdasarkan tanggal publikasi dan memeriksa apakah ID publikasi terakhir cocok dengan nilai di GroupSub. Jika tidak cocok, maka Anda perlu memahami secara pasti berapa banyak artikel yang telah diterbitkan sejak terakhir kali. Kami memperbarui last_article_id di GroupSub7 ke kondisi saat ini.
-
Ketika kami menemukan daftar artikel yang diterbitkan, kami menemukan semua pengguna ACTIVE untuk grup ini dan mengirimi mereka pemberitahuan tentang artikel baru.
Kami menulis JavaRushPostClient
Di sini kami tidak akan mencoba untuk mencakup semua permintaan yang dikirimkan kepada kami di API dan hanya akan membuat permintaan yang kami perlukan. Dengan melakukan ini, kami mencapai dua tujuan sekaligus:-
Kami mempercepat proses penulisan aplikasi kami.
-
Kami menyerahkan pekerjaan ini kepada mereka yang ingin membantu komunitas kami dan memutuskan untuk mencoba sendiri sebagai pengembang. Saya akan membuat tugas untuk ini yang bisa diselesaikan setelah MVP.
Info Pengguna Dasar:
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
}
Info Suka:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents like's information.
*/
public class LikesInfo {
private Integer count;
private LikeStatus status;
}
Status Suka:
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
}
Jenis Posting:
package com.github.javarushcommunity.jrtb.javarushclient.dto;
/**
* DTO, which represents post types.
*/
public enum PostType {
UNKNOWN, USUAL, INNER_LINK, OUTER_LINK
}
Status Publik Pengguna:
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:
Info Posting:
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 buat antarmuka untuk digunakan dan implementasinya. Kita hanya memerlukan satu metode untuk bekerja dengan artikel:
Klien JavaRushPost:
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 argumen: ID grup dan ID terakhir artikel yang telah diposting bot. Oleh karena itu, semua artikel yang diterbitkan setelah artikel dengan lastPostId akan dikirimkan . Dan implementasinya:
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 menambahkan beberapa filter ke permintaan:
- order = NEW - agar daftar berisi yang baru terlebih dahulu;
- groupKid = groupId - cari hanya untuk grup tertentu;
- limit = 15 — kami membatasi jumlah artikel per permintaan. Frekuensi kami adalah 15-20 menit dan kami berharap selama ini tidak LEBIH dari 15 (!) yang 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 tes yang sangat sederhana yang memeriksa apakah ada komunikasi dengan klien atau tidak. Dia menemukan 15 artikel baru di grup proyek Java, karena saya memberinya ID artikel pertama di grup ini, dan sudah ada lebih dari 15... Sudah ada 22! Saya bahkan tidak menyangka jumlahnya akan sebanyak itu. Bagaimana saya bisa mengetahuinya dengan cepat? Apakah menurut Anda dia pergi untuk menghitungnya? Tidak) Saya menggunakan kesombongan dan melihat jumlah artikel untuk kelompok tertentu. Ngomong-ngomong, Anda bisa melihat seperti ini di artikel lain... Dan berapa banyak artikel yang ada di grup ACAK?... Saya akan beri tahu Anda sekarang: ada 1062 artikel! Jumlah yang serius.
GO TO FULL VERSION