From 76bbc2a630540e07539aecbb0784a0b38ab58341 Mon Sep 17 00:00:00 2001 From: Falmer Date: Mon, 9 Feb 2026 17:34:39 +0300 Subject: [PATCH] Initial --- .gitattributes | 3 ++ .gitignore | 37 ++++++++++++++ build.gradle | 38 ++++++++++++++ gradle/wrapper/gradle-wrapper.properties | 7 +++ settings.gradle | 1 + .../java/ru/ilug/telegram_bot/GetUpdates.java | 22 ++++++++ .../MyTelegramBotApplication.java | 15 ++++++ .../ilug/telegram_bot/ResponseParameters.java | 14 ++++++ .../ru/ilug/telegram_bot/TelegramClient.java | 38 ++++++++++++++ .../ilug/telegram_bot/TelegramResponse.java | 22 ++++++++ .../ru/ilug/telegram_bot/TelegramService.java | 50 +++++++++++++++++++ .../java/ru/ilug/telegram_bot/UpdateDto.java | 12 +++++ src/main/resources/application.properties | 3 ++ .../MyTelegramBotApplicationTests.java | 13 +++++ 14 files changed, 275 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100644 settings.gradle create mode 100644 src/main/java/ru/ilug/telegram_bot/GetUpdates.java create mode 100644 src/main/java/ru/ilug/telegram_bot/MyTelegramBotApplication.java create mode 100644 src/main/java/ru/ilug/telegram_bot/ResponseParameters.java create mode 100644 src/main/java/ru/ilug/telegram_bot/TelegramClient.java create mode 100644 src/main/java/ru/ilug/telegram_bot/TelegramResponse.java create mode 100644 src/main/java/ru/ilug/telegram_bot/TelegramService.java create mode 100644 src/main/java/ru/ilug/telegram_bot/UpdateDto.java create mode 100644 src/main/resources/application.properties create mode 100644 src/test/java/ru/ilug/telegram_bot/MyTelegramBotApplicationTests.java diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8af972c --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +/gradlew text eol=lf +*.bat text eol=crlf +*.jar binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2065bc --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +HELP.md +.gradle +build/ +!gradle/wrapper/gradle-wrapper.jar +!**/src/main/**/build/ +!**/src/test/**/build/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache +bin/ +!**/src/main/**/bin/ +!**/src/test/**/bin/ + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr +out/ +!**/src/main/**/out/ +!**/src/test/**/out/ + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ + +### VS Code ### +.vscode/ diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..44ee306 --- /dev/null +++ b/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'java' + id 'org.springframework.boot' version '4.0.2' + id 'io.spring.dependency-management' version '1.1.7' +} + +group = 'ru.ilug' +version = '0.0.1-SNAPSHOT' +description = 'Demo project for Spring Boot' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} + +configurations { + compileOnly { + extendsFrom annotationProcessor + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-webmvc' + implementation 'org.springframework.boot:spring-boot-starter-webflux' + compileOnly 'org.projectlombok:lombok' + annotationProcessor 'org.projectlombok:lombok' + testImplementation 'org.springframework.boot:spring-boot-starter-webmvc-test' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' +} + +tasks.named('test') { + useJUnitPlatform() +} diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..19a6bde --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip +networkTimeout=10000 +validateDistributionUrl=true +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..3a7f027 --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'my_telegram_bot' diff --git a/src/main/java/ru/ilug/telegram_bot/GetUpdates.java b/src/main/java/ru/ilug/telegram_bot/GetUpdates.java new file mode 100644 index 0000000..01397f3 --- /dev/null +++ b/src/main/java/ru/ilug/telegram_bot/GetUpdates.java @@ -0,0 +1,22 @@ +package ru.ilug.telegram_bot; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.annotation.Nullable; +import lombok.Data; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +public class GetUpdates { + + @Nullable + private Integer offset; + @Nullable + private Integer limit; + @Nullable + private Integer timeout; + @Nullable + @JsonProperty("allowed_updates") + private String[] allowedUpdates; + +} diff --git a/src/main/java/ru/ilug/telegram_bot/MyTelegramBotApplication.java b/src/main/java/ru/ilug/telegram_bot/MyTelegramBotApplication.java new file mode 100644 index 0000000..12d6996 --- /dev/null +++ b/src/main/java/ru/ilug/telegram_bot/MyTelegramBotApplication.java @@ -0,0 +1,15 @@ +package ru.ilug.telegram_bot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; + +@SpringBootApplication +@EnableScheduling +public class MyTelegramBotApplication { + + public static void main(String[] args) { + SpringApplication.run(MyTelegramBotApplication.class, args); + } + +} diff --git a/src/main/java/ru/ilug/telegram_bot/ResponseParameters.java b/src/main/java/ru/ilug/telegram_bot/ResponseParameters.java new file mode 100644 index 0000000..663c8db --- /dev/null +++ b/src/main/java/ru/ilug/telegram_bot/ResponseParameters.java @@ -0,0 +1,14 @@ +package ru.ilug.telegram_bot; + +import jakarta.annotation.Nullable; +import lombok.Data; + +@Data +public class ResponseParameters { + + @Nullable + private Integer migrateToChatId; + @Nullable + private Integer retryAfter; + +} diff --git a/src/main/java/ru/ilug/telegram_bot/TelegramClient.java b/src/main/java/ru/ilug/telegram_bot/TelegramClient.java new file mode 100644 index 0000000..f47316c --- /dev/null +++ b/src/main/java/ru/ilug/telegram_bot/TelegramClient.java @@ -0,0 +1,38 @@ +package ru.ilug.telegram_bot; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.ParameterizedTypeReference; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +import java.util.List; + +@Component +public class TelegramClient { + + private final WebClient webClient; + + public TelegramClient(@Value("${application.telegram.token}") String telegramToken) { + webClient = WebClient.builder() + .baseUrl("https://api.telegram.org/bot" + telegramToken) + .defaultHeaders(headers -> { + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + headers.setContentType(MediaType.APPLICATION_JSON); + }) + .build(); + } + + @PostMapping + public Mono>> getUpdates(GetUpdates request) { + return webClient.post() + .uri("/getUpdates") + .bodyValue(request) + .retrieve() + .bodyToMono(new ParameterizedTypeReference<>() { + }); + } + +} diff --git a/src/main/java/ru/ilug/telegram_bot/TelegramResponse.java b/src/main/java/ru/ilug/telegram_bot/TelegramResponse.java new file mode 100644 index 0000000..b9f6b9e --- /dev/null +++ b/src/main/java/ru/ilug/telegram_bot/TelegramResponse.java @@ -0,0 +1,22 @@ +package ru.ilug.telegram_bot; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.annotation.Nullable; +import lombok.Data; + +@Data +public class TelegramResponse { + + private boolean ok; + @Nullable + private String description; + @Nullable + private T result; + + @JsonProperty("error_code") + private int errorCode; + + @Nullable + private ResponseParameters parameters; + +} diff --git a/src/main/java/ru/ilug/telegram_bot/TelegramService.java b/src/main/java/ru/ilug/telegram_bot/TelegramService.java new file mode 100644 index 0000000..9d906e1 --- /dev/null +++ b/src/main/java/ru/ilug/telegram_bot/TelegramService.java @@ -0,0 +1,50 @@ +package ru.ilug.telegram_bot; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.ContextRefreshedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.time.Duration; + +@Slf4j +@Service +@RequiredArgsConstructor +public class TelegramService { + + private final TelegramClient telegramClient; + + private Integer lastUpdateId; + + @EventListener(ContextRefreshedEvent.class) + public void onStart() { + Mono.delay(Duration.ofMillis(3000)) + .flatMapMany(i -> update()) + .repeat() + .subscribe(); + } + + public Flux update() { + GetUpdates request = new GetUpdates(); + request.setOffset(lastUpdateId); + + return telegramClient.getUpdates(request) + .doOnNext(response -> { + if (!response.isOk()) { + throw new RuntimeException(response.getDescription()); + } + }).flatMapIterable(response -> { + assert response.getResult() != null; + return response.getResult(); + }).doOnNext(this::update); + } + + private void update(UpdateDto updateDto) { + log.info("Get update with id: {}", updateDto.getUpdateId()); + lastUpdateId = updateDto.getUpdateId() + 1; + } + +} diff --git a/src/main/java/ru/ilug/telegram_bot/UpdateDto.java b/src/main/java/ru/ilug/telegram_bot/UpdateDto.java new file mode 100644 index 0000000..5edd2e7 --- /dev/null +++ b/src/main/java/ru/ilug/telegram_bot/UpdateDto.java @@ -0,0 +1,12 @@ +package ru.ilug.telegram_bot; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data +public class UpdateDto { + + @JsonProperty("update_id") + private int updateId; + +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 0000000..a8692d0 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.application.name=my-telegram-bot + +application.telegram.token= \ No newline at end of file diff --git a/src/test/java/ru/ilug/telegram_bot/MyTelegramBotApplicationTests.java b/src/test/java/ru/ilug/telegram_bot/MyTelegramBotApplicationTests.java new file mode 100644 index 0000000..d77fd47 --- /dev/null +++ b/src/test/java/ru/ilug/telegram_bot/MyTelegramBotApplicationTests.java @@ -0,0 +1,13 @@ +package ru.ilug.telegram_bot; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class MyTelegramBotApplicationTests { + + @Test + void contextLoads() { + } + +}