@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);
}
Logika bisa digunakake ing kene: yen database kita wis duwe pangguna kaya chatId, kita mung nyetel kolom aktif = bener kanggo dheweke. Lan yen ora ana pangguna kasebut, kita nggawe sing anyar. Padha kanggo perintah / stop ing 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);
}
Bisa dideleng yen nalika nelpon printah iki, mung aktif = kolom palsu disetel kanggo pangguna. Lan kabeh iki: langganane bakal urip lan ngenteni ing swiwi nalika pangguna mutusake maneh kanggo ngaktifake obrolan karo bot. Lan misale jek tugas wis rampung lan bisa ditutup. Nanging ora ana. Tugas sing paling penting yaiku nggawe tandha babagan artikel anyar ing langganan. Iki ngendi tugas iki bakal rampung dianyari lan rampung. Tegese, nganti kita wis ngetrapake kabar babagan artikel anyar, ora bisa ditutup. Mula, ayo nindakake tugas JRTB-4 - nggawe cek saben 20 menit lan kabar babagan artikel anyar. Kanca-kanca! Apa sampeyan pengin ngerti langsung nalika kode anyar kanggo proyek kasebut dirilis? Kapan artikel anyar metu? Join channel tg aku . Ing kana aku ngumpulake artikelku, pikiranku, pangembangan open-source bebarengan.
Kita ngleksanakake JRTB-4
Apa sing kudu ditindakake minangka bagean saka tugas iki:-
Nggawe proyek sing periodik bakal ngunjungi kabeh grup sing kita duwe langganan ing database, urut artikel miturut tanggal publikasi lan mriksa apa ID saka publikasi pungkasan cocog karo nilai ing GroupSub. Yen ora cocog, sampeyan kudu ngerti persis carane akeh artikel sing wis diterbitake wiwit pungkasan. Kita nganyari last_article_id ing GroupSub7 menyang kahanan saiki.
-
Nalika kita nemokake dhaptar artikel sing diterbitake, kita nemokake kabeh pangguna AKTIF kanggo grup kasebut lan ngirim kabar babagan artikel anyar.
Kita nulis JavaRushPostClient
Ing kene kita ora bakal nyoba kanggo nutupi kabeh panjalukan sing dikirim menyang kita ing API lan mung bakal nggawe sing dibutuhake. Kanthi nindakake iki, kita entuk rong tujuan bebarengan:-
Kita nyepetake proses nulis aplikasi kita.
-
Kita ninggalake karya iki kanggo wong-wong sing pengin mbantu masyarakat lan mutusake kanggo nyoba dhewe minangka pangembang. Aku bakal nggawe tugas kanggo iki sing bisa rampung sawise 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;
}
Basa:
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
}
Tipe Pos:
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
}
Adhedhasar kabeh DTO iki, ayo nulis kelas utama kanggo nampa artikel:
PostInfo:
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;
}
Saiki ayo nggawe antarmuka sing bisa digunakake lan implementasine. Kita mung butuh siji cara kanggo nggarap 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 njupuk rong argumen: ID grup lan ID pungkasan artikel sing wis dikirim bot. Mulane, kabeh artikel sing diterbitake luwih saka artikel karo lastPostId bakal dikirim . Lan implementasine:
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;
}
}
Kita nambah sawetara saringan menyang panyuwunan:
- pesenan = NEW - supaya dhaptar ngemot sing anyar dhisik;
- groupKid = groupId - golek mung kanggo grup tartamtu;
- watesan = 15 - kita matesi jumlah artikel saben request. Frekuensi kita yaiku 15-20 menit lan kita ngarepake yen ing wektu iki ora luwih saka 15 (!) bakal 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());
}
}
Iki minangka tes sing gampang banget sing mriksa manawa ana komunikasi karo klien utawa ora. Dheweke nemokake 15 artikel anyar ing grup proyek Java, amarga aku menehi ID artikel pisanan ing grup iki, lan wis ana luwih saka 15 ... Wis ana 22! Aku malah ora ngira bakal akeh banget. Kepiye carane aku ngerti kanthi cepet? Apa sampeyan mikir dheweke lunga ngetung? Ora) Aku nggunakake swager lan ndeleng jumlah artikel kanggo klompok tartamtu. Ngomong-ngomong, sampeyan bisa ndeleng cara iki ing wong liya ... Lan pirang-pirang artikel ing grup RANDOM? ... Aku bakal pitutur marang kowe saiki: ana 1062! Jumlah sing serius.
GO TO FULL VERSION