diff --git a/Dockerfile b/Dockerfile index 74c125e..66ec882 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,18 @@ FROM openjdk:17 -ARG JAR_FILE=build/libs/lun-0.0.1-SNAPSHOT.jar +ENV TG_TARGET_ID=default +ENV TG_MINE=default +ENV WEATHER_KEY=default +ENV BOT_KEY=default +ENV DATASOURCE_URL=default +ENV MONGODB_HOST=default +LABEL maintainer="lunaticbum " +LABEL version="0.0.4" +LABEL description="Spring Boot Jar Test" + +ARG JAR_FILE=build/libs/lun-0.0.4-SNAPSHOT.jar COPY ${JAR_FILE} app.jar EXPOSE 8080 -ENTRYPOINT ["java","-jar","app.jar"] \ No newline at end of file +EXPOSE 27012 +EXPOSE 3307 +ENTRYPOINT ["java","-Dtelegram.bot.key=${BOT_KEY}","-Dtelegram.my.id=${TG_MINE}","-Dtelegram.target.id=${TG_TARGET_ID}","-Dweather.api.key=${WEATHER_KEY}","-Dspring.datasource.url=${DATASOURCE_URL}" ,"-Dspring.data.mongodb.host=${MONGODB_HOST}" ,"-jar","app.jar"] +#ENTRYPOINT ["java","-jar","app.jar","-Dspring-boot.run.arguments=--telegram.bot.key=${BOT_KEY}, --telegram.my.id=${TG_MINE}, --telegram.target.id=${TG_TARGET_ID}, --weather.api.key=${WEATHER_KEY}"] \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 9e98a10..6ab7def 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "kr.lunaticbum.back" -version = "0.0.1-SNAPSHOT" +version = "0.0.4-SNAPSHOT" java { toolchain { diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/LunApplication.kt b/src/main/kotlin/kr/lunaticbum/back/lun/LunApplication.kt index fbd7c63..66b9be6 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/LunApplication.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/LunApplication.kt @@ -1,45 +1,52 @@ package kr.lunaticbum.back.lun -import com.google.gson.Gson -import kr.lunaticbum.back.lun.model.CurrentWeather -import org.springframework.boot.CommandLineRunner -import org.springframework.boot.SpringApplication +import org.springframework.beans.factory.annotation.Value import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.runApplication -import org.springframework.context.annotation.Bean +import org.springframework.context.EnvironmentAware +import org.springframework.core.env.Environment import org.springframework.scheduling.annotation.EnableScheduling -import org.springframework.scheduling.annotation.Scheduled -import org.springframework.web.reactive.function.client.WebClient -import java.time.LocalDateTime -import java.util.* +import org.springframework.stereotype.Component + @EnableScheduling // 추가 @SpringBootApplication -class LunApplication { - @Scheduled(cron = "0 0 0/4 * * *") // - fun runJob() { - try { - val client0 = WebClient.create() - val result = client0.get() - .uri("http://api.weatherapi.com/v1/current.json?key=de574a260b1f474d99955729241909&q=seoul&aqi=no") - .retrieve() - .bodyToMono(String::class.java).block() ?: "FAIL" - var sss = Gson().fromJson(result,CurrentWeather::class.java) +class LunApplication() { + - val client = WebClient.create() - client.get() - .uri("https://api.telegram.org/bot7934509464:AAE_xUbICxMdywLGnxo7BkeIqA1nVza4P9w/sendMessage?chat_id=71476436&text=온도${sss.current?.temp_c}") - .retrieve() - .bodyToMono(String::class.java).block() ?: "FAIL" - }catch (e : Exception) { - e.printStackTrace() - } - } } +//@Component +//class GEnv : EnvironmentAware { +// @Value("\${telegram.bot.key}") +// var telegramBotKey: String? = "" +// +// @Value("\${telegram.my.id}") +// var telegramMyId: String? = "" +// +// @Value("\${weather.api.key}") +// var weatherApiKey: String? = "" +// +// +// override fun setEnvironment(environment: Environment) { +// println ("telegramBotKey $telegramBotKey") +// println("telegramMyId $telegramMyId") +// println("weatherApiKey $weatherApiKey") +// } +//} fun main(args: Array) { +// val props = System.getProperties() +// val enumerator = props.keys() +// while (enumerator.hasMoreElements()) { +// val ele = enumerator.nextElement() +// val key = ele.toString() +// println(key + ": " + System.getProperty(key)) +// } + args.forEach { + println("main ARG >> $it") + } runApplication(*args) } // diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/AppConfig.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/AppConfig.kt index 598da80..b283a57 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/configs/AppConfig.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/AppConfig.kt @@ -1,5 +1,6 @@ package kr.lunaticbum.back.lun.configs +import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.web.servlet.config.annotation.EnableWebMvc @@ -8,6 +9,15 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc @Configuration @EnableWebMvc class AppConfig { + +// @Bean +// fun getProperty() : Map{ +// println("telegramBotKey >>>> $telegramBotKey") +// println("telegramMyId >>>> $telegramMyId") +// println("weatherApiKey >>>> $weatherApiKey") +// +// return hashMapOf(Pair("telegramMyId",telegramMyId)) +// } // @Bean // fun memberRepository(): MemberRepository { // return MemoryMemberRepository() diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/GlobalEnvironment.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/GlobalEnvironment.kt new file mode 100644 index 0000000..ee74148 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/GlobalEnvironment.kt @@ -0,0 +1,30 @@ +package kr.lunaticbum.back.lun.configs + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.EnvironmentAware +import org.springframework.core.env.Environment +import org.springframework.stereotype.Component + +@Component +class GlobalEnvironment : EnvironmentAware { + @Value("\${telegram.bot.key}") + var telegramBotKey: String? = "" + + @Value("\${telegram.my.id}") + var telegramMyId: String? = "" + + @Value("\${telegram.target.id}") + var telegramTargetId: String? = "" + + @Value("\${weather.api.key}") + var weatherApiKey: String? = "" + + + override fun setEnvironment(environment: Environment) { + println ("telegramBotKey $telegramBotKey") + println("telegramMyId $telegramMyId") + println("telegramMyId $telegramTargetId") + println("weatherApiKey $weatherApiKey") + } + +} \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/configs/RootAppContext.kt b/src/main/kotlin/kr/lunaticbum/back/lun/configs/RootAppContext.kt index b567afe..2656e32 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/configs/RootAppContext.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/configs/RootAppContext.kt @@ -1,7 +1,32 @@ package kr.lunaticbum.back.lun.configs +import com.mongodb.reactivestreams.client.MongoClient +import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.data.mongodb.core.MongoTemplate +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories +import org.springframework.scheduling.annotation.EnableAsync + @Configuration +@EnableMongoRepositories( basePackages = arrayOf("kr.lunaticbum.back.lun")) +@EnableAsync class RootAppContext { +// @Bean +// fun mongoClient(): MongoClient { +// return MongoClient("localhost") +// } + +// fun mongoDbFactory(): MongoDbFactory { +// return SimpleMongoDbFactory(mongoClient(), "test") +// } + +// @Bean +// fun mongoTemplate(): MongoTemplate { +// return MongoTemplate(mongoDbFactory()) +// } + +// fun mongoTemplate() :MongoTemplate { +// return MongoTemplate() +// } } \ No newline at end of file diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt index d539441..b0f4850 100644 --- a/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt +++ b/src/main/kotlin/kr/lunaticbum/back/lun/controllers/Telegram.kt @@ -1,11 +1,36 @@ package kr.lunaticbum.back.lun.controllers +import com.google.gson.Gson +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.flow.asFlow +import kotlinx.coroutines.flow.onCompletion +import kotlinx.coroutines.launch +import kr.lunaticbum.back.lun.configs.GlobalEnvironment +import kr.lunaticbum.back.lun.model.CurrentWeather +import kr.lunaticbum.back.lun.model.Message +import kr.lunaticbum.back.lun.model.TelegramMsgService +import kr.lunaticbum.back.lun.model.TelegramUpdate +import kr.lunaticbum.back.lun.utils.LogService +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.context.annotation.Bean +import org.springframework.scheduling.annotation.Scheduled import org.springframework.web.bind.annotation.* import org.springframework.web.reactive.function.client.WebClient +import java.util.* + @RestController @RequestMapping("tlg") class Telegram { + + @Autowired + lateinit var globalEvv : GlobalEnvironment + + @Autowired + lateinit var telegramService: TelegramMsgService + @Autowired + lateinit var logService: LogService + @ResponseBody @GetMapping("/hello") fun hello(): String { @@ -18,7 +43,7 @@ class Telegram { println("path >>> $path") val client = WebClient.create() client.get() - .uri("https://api.telegram.org/bot7934509464:AAE_xUbICxMdywLGnxo7BkeIqA1nVza4P9w/getUpdates") + .uri("https://api.telegram.org/${globalEvv.telegramBotKey}/getUpdates") .retrieve() .bodyToMono(String::class.java).block() ?: "FAIL" @@ -36,4 +61,101 @@ class Telegram { // // } -} \ No newline at end of file + + @Bean + @Scheduled(cron = "0 0 0/2 * * *") // + fun runJob() { + try { + println("telegramBotKey >>>> ${globalEvv.telegramBotKey}") + println("telegramMyId >>>> ${globalEvv.telegramMyId}") + println("weatherApiKey >>>> ${globalEvv.weatherApiKey}") + if (globalEvv.weatherApiKey?.length ?: 0 > 3 && globalEvv.telegramBotKey?.length ?: 0 > 3 && globalEvv.telegramMyId?.length ?: 0 > 3) { + val client0 = WebClient.create() + val result = client0.get() + .uri("http://api.weatherapi.com/v1/current.json?key=${globalEvv.weatherApiKey}&q=seoul&aqi=no") + .retrieve() + .bodyToMono(String::class.java) + .block() ?: "FAIL" + var sss = Gson().fromJson(result, CurrentWeather::class.java) + + val client = WebClient.create() + client.get() + .uri("https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=온도${sss.current?.temp_c}") + .retrieve() + .bodyToMono(String::class.java).block() ?: "FAIL" + } + }catch (e : Exception) { + e.printStackTrace() + } + + } + + + @Bean + @Scheduled(cron = "0 0/2 * * * *") // + fun pollingTelegramUpdate() { + try { + println("pollingTelegramUpdate telegramBotKey >>>> ${globalEvv.telegramBotKey}") + println("pollingTelegramUpdate telegramMyId >>>> ${globalEvv.telegramMyId}") + println("pollingTelegramUpdate weatherApiKey >>>> ${globalEvv.weatherApiKey}") + if (globalEvv.weatherApiKey?.length ?: 0 > 3 && globalEvv.telegramBotKey?.length ?: 0 > 3 && globalEvv.telegramMyId?.length ?: 0 > 3) { + val client0 = WebClient.create() + val result = client0.get() + .uri("https://api.telegram.org/${globalEvv.telegramBotKey}/getUpdates") + .retrieve() + .bodyToMono(String::class.java).block() ?: "FAIL" + println("pollingTelegramUpdate result >>>> $result") + var sss = Gson().fromJson(result, TelegramUpdate::class.java) + println("pollingTelegramUpdate sss >>>> $sss") + if (sss.isSucces()) { + sss.result?.filter { +// println("${(it.message?.date ?: 0L).times(1000L) } > ${before5Min()} ${(it.message?.date ?: 0L).times(1000L) - before5Min()} ") + ((it.message?.date ?: 0L) * 1000L) > before5Min() + }?.forEach { + println("pollingTelegramUpdate before Query doOnSuccess m >>>> ${it}") + it.message?.let { msg -> + println("pollingTelegramUpdate before Query doOnSuccess m >>>> ${msg.message_id}") + qns(msg.message_id,msg) + } + } + } + } + }catch (e : Exception) { + e.printStackTrace() + } + } + + fun qns(it : Int, msg : Message) { + + telegramService.has(it)?.subscribe { m -> + println("pollingTelegramUpdate doOnSuccess m >>>> $m") + if (m == 0L) { + if (msg.text?.contains("어디") == true) { + sendMsg() + } else { + logService.log(msg.text ?: "NONE") + } + telegramService.save(msg) + } else { + + } + } + } + fun sendMsg() { + val client = WebClient.create() + client.get() + .uri("https://api.telegram.org/${globalEvv.telegramBotKey}/sendMessage?chat_id=${globalEvv.telegramMyId}&text=/g_mustShareLocation") + .retrieve() + .bodyToMono(String::class.java).block() ?: "FAIL" + } + + +} + +fun before5Min(): Long { + val cal: Calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")) + cal.setTime(Date(System.currentTimeMillis())) + cal.timeZone = TimeZone.getDefault() + cal.add(Calendar.MINUTE, -10) + return cal.timeInMillis +} diff --git a/src/main/kotlin/kr/lunaticbum/back/lun/model/TelegramUpdate.kt b/src/main/kotlin/kr/lunaticbum/back/lun/model/TelegramUpdate.kt new file mode 100644 index 0000000..fbbeb52 --- /dev/null +++ b/src/main/kotlin/kr/lunaticbum/back/lun/model/TelegramUpdate.kt @@ -0,0 +1,112 @@ +package kr.lunaticbum.back.lun.model + +import kr.lunaticbum.back.lun.utils.LogService +import lombok.AllArgsConstructor +import lombok.Data +import lombok.NoArgsConstructor +import org.bson.codecs.pojo.annotations.BsonIgnore +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.data.annotation.Id +import org.springframework.data.mongodb.core.mapping.Document +import org.springframework.data.mongodb.repository.Query +import org.springframework.data.mongodb.repository.ReactiveMongoRepository +import org.springframework.stereotype.Repository +import org.springframework.stereotype.Service +import reactor.core.publisher.Mono +import java.util.* + + +// import com.fasterxml.jackson.databind.ObjectMapper; // version 2.11.1 +// import com.fasterxml.jackson.annotation.JsonProperty; // version 2.11.1 +/* ObjectMapper om = new ObjectMapper(); +Root root = om.readValue(myJsonString, Root.class); */ +class Chat { + var id: Int = 0 + var first_name: String? = null + var last_name: String? = null + var username: String? = null + var type: String? = null +} + +class Entity { + var offset: Int = 0 + var length: Int = 0 + var type: String? = null +} + +class From { + var id: Int = 0 + var is_bot: Boolean = false + var first_name: String? = null + var last_name: String? = null + var username: String? = null + var language_code: String? = null +} + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Document(collection = "TelegramMessage") +class Message { + @Id + var message_id: Int = 0 + + @BsonIgnore + var from: From? = null + @BsonIgnore + var chat: Chat? = null + var date: Long = 0 + var text: String? = null + @BsonIgnore + var entities: ArrayList? = null +} + + +class Result { + var update_id: Int = 0 + var message: Message? = null +} + +class TelegramUpdate { + fun isSucces() = ok == true + + var ok: Boolean = false + var result: ArrayList? = null +} + +@Repository +interface TelegramRepository : ReactiveMongoRepository { + @Query("{id :?0}") + override fun findById(id: String): Mono + + @Query("{id :?0}") + fun count(id: Int): Mono +} +interface MsgService { + fun findById(id: String): Mono? +} + +@Service +class TelegramMsgService : MsgService { + @Autowired + private lateinit var logService: LogService + + @Autowired + private lateinit var telegramRepository: TelegramRepository + + + + override fun findById(id: String): Mono? { + return telegramRepository.findById(id) + } + + + fun has(id: Int): Mono? { + return telegramRepository.count(id) + } + + fun save(msg: Message) { + telegramRepository.save(msg) + logService.log("saved msg ${msg}") + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 64b48f2..49ecd75 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,15 +1,24 @@ spring.application.name=lun -spring.datasource.url=jdbc:mariadb://lunaticbum.kr:3307/lun_db + #spring.datasource.url=jdbc:mariadb://localhost:3307/lun_db spring.datasource.username=lun_admin spring.datasource.password=VioPup*383 spring.datasource.driver-class-name=org.mariadb.jdbc.Driver -spring.data.mongodb.host=nas.lunaticbum.kr -#spring.data.mongodb.host=localhost -spring.data.mongodb.port=27017 -spring.data.mongodb.database=lun_db +#spring.data.mongodb.host=mongodb://127.0.0.1 +spring.datasource.url=jdbc:mariadb://127.0.0.1:3307/lun_db +spring.data.mongodb.host=mongo.sbspace.synology.me/?authSource=admin +#///mogodb://mongo.sbspace.synology.me +#spring.data.mongodb.host=mongo.sbspace.synology.me +#spring.data.mongodb.port=443 +spring.data.mongodb.username=lun_admin +spring.data.mongodb.password=VioPup*383 +spring.data.mongodb.database=Telegram #spring.main.web-application-type=SERVLET #logging.level.org.springframework.boot.autoconfigure=ERROR #spring.mvc.view.prefix=/templates #spring.mvc.view.suffix=.html -#server.servlet.register-default-servlet=true \ No newline at end of file +#server.servlet.register-default-servlet=true +telegram.bot.key=1 +telegram.my.id=2 +telegram.target.id=3 +weather.api.key=3 \ No newline at end of file