commit 2a6dec29226ad4c441591eb1f4bbfc5c5566971c Author: Sambo Chea Date: Thu May 20 18:43:52 2021 +0700 Completed telegram messaging service and provider for send message via bot diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a281dd4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,38 @@ +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/ +.DS_Store diff --git a/README.md b/README.md new file mode 100644 index 0000000..809e1c5 --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# CUBETIQ Messaging Client +- [x] Message Provider +- [x] Telegram +- [ ] SMS + +# How-to-use +- Environment +```text +CUBETIQ_TELEGRAM_TOKEN: Telegram Bot Token +CUBETIQ_TELEGRAM_RECEIVER: Telegram Chat Id to receiver the message +``` + +# Contributors +- Sambo Chea \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 0000000..e312c02 --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,37 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile + +plugins { + id("java") + kotlin("jvm") version "1.4.32" +} + +group = "com.cubetiqs" +version = "0.0.1-SNAPSHOT" +java.sourceCompatibility = JavaVersion.VERSION_1_8 + +repositories { + mavenCentral() +} + +dependencies { + implementation("com.squareup.okhttp3:okhttp:4.9.0") + + implementation("org.jetbrains.kotlin:kotlin-reflect") + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") + + testImplementation("org.junit.jupiter:junit-jupiter:5.7.0") +} + +tasks.withType { + kotlinOptions { + freeCompilerArgs = listOf("-Xjsr305=strict") + jvmTarget = "1.8" + } +} + +tasks.test { + useJUnitPlatform() + testLogging { + events("passed", "skipped", "failed") + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..442d913 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100644 index 0000000..4f906e0 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..107acd3 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,89 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 0000000..f05bcc9 --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "messaging-client" diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/provider/MessageProvider.kt b/src/main/kotlin/com/cubetiqs/messaging/client/provider/MessageProvider.kt new file mode 100644 index 0000000..c437c2c --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/provider/MessageProvider.kt @@ -0,0 +1,6 @@ +package com.cubetiqs.messaging.client.provider + +@FunctionalInterface +fun interface MessageProvider { + fun send(): Any? +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/sms/SmsProvider.kt b/src/main/kotlin/com/cubetiqs/messaging/client/sms/SmsProvider.kt new file mode 100644 index 0000000..9419fd5 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/sms/SmsProvider.kt @@ -0,0 +1,6 @@ +package com.cubetiqs.messaging.client.sms + +import com.cubetiqs.messaging.client.provider.MessageProvider + +interface SmsProvider : MessageProvider { +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramBotUtils.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramBotUtils.kt new file mode 100644 index 0000000..cb0afe1 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramBotUtils.kt @@ -0,0 +1,90 @@ +package com.cubetiqs.messaging.client.telegram + +import com.cubetiqs.messaging.client.webclient.WebClientUtils +import okhttp3.* +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.RequestBody.Companion.asRequestBody +import java.nio.file.Files + +object TelegramBotUtils { + private fun getBotUrl(endpoint: String, token: String = ""): String { + return "${TelegramConfig.TELEGRAM_API}/bot${token.removePrefix("bot")}/${endpoint.removePrefix("/")}" + } + + private fun makeRequest( + request: Request, + ): Response? { + println(javaClass.canonicalName + " => Start send message via telegram bot...") + return try { + WebClientUtils.makeRequest(request) + } catch (ex: Exception) { + ex.printStackTrace() + println("Make request error @${ex.message}") + null + } + } + + @JvmStatic + fun sendMessage( + // usually chat id from chat group + chatId: String, + // message to send + text: String, + // config prefix for custom token + token: String = "", + ): Any? { + val requestBody = MultipartBody.Builder() + .addFormDataPart("text", text) + .addFormDataPart("chat_id", chatId) + .setType(MultipartBody.FORM) + .build() + + val url = getBotUrl(TelegramConfig.SEND_MESSAGE, token) + val request = Request.Builder() + .url(url) + .post(requestBody) + .build() + + val result = makeRequest(request) + println(javaClass.canonicalName + " => Complete sent message to $chatId...") + return result + } + + @JvmStatic + fun sendDocument( + // usually chat id from chat group + chatId: String, + // message to send + text: String, + // document extension (example: my_file.pdf, my_file.docx, etc) + filename: String, + // document in byte array + document: ByteArray, + // config prefix for custom token + token: String = "", + ): Any? { + val ext = filename.split(".").lastOrNull() ?: "dat" + val tempFile = Files.createTempFile(filename.removeSuffix(ext), ".$ext") + Files.write(tempFile, document) + + val requestBody = MultipartBody.Builder() + .addFormDataPart( + "document", filename, + tempFile.toFile().asRequestBody("application/octet-stream".toMediaTypeOrNull()) + ) + .addFormDataPart("caption", text) + .addFormDataPart("chat_id", chatId) + .setType(MultipartBody.FORM) + .build() + + val url = getBotUrl(TelegramConfig.SEND_DOCUMENT, token) + val request = Request.Builder() + .url(url) + .post(requestBody) + .build() + + val result = makeRequest(request) + println(javaClass.canonicalName + " => Complete sent document to $chatId...") + return result + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramChatMessage.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramChatMessage.kt new file mode 100644 index 0000000..5d31b46 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramChatMessage.kt @@ -0,0 +1,15 @@ +package com.cubetiqs.messaging.client.telegram + +/** + * Telegram Chat Message + * + * @author sombochea + * @since 1.0 + */ +open class TelegramChatMessage( + private val text: String? = null, +) : TelegramMessage { + override fun getText(): String { + return text ?: "" + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramConfig.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramConfig.kt new file mode 100644 index 0000000..49ba010 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramConfig.kt @@ -0,0 +1,22 @@ +package com.cubetiqs.messaging.client.telegram + +import com.cubetiqs.messaging.client.util.ConfigUtils + +object TelegramConfig { + const val TELEGRAM_API = "https://api.telegram.org" + const val SEND_DOCUMENT = "/sendDocument" + const val SEND_MESSAGE = "/sendMessage" + const val POS_SYSTEM_ID = "" + private const val CUBETIQ_TELEGRAM_TOKEN = "CUBETIQ_TELEGRAM_TOKEN" + private const val CUBETIQ_TELEGRAM_RECEIVER = "CUBETIQ_TELEGRAM_RECEIVER" + + @JvmStatic + fun getToken(): String { + return ConfigUtils.getEnv(CUBETIQ_TELEGRAM_TOKEN, ConfigUtils.getProperty(CUBETIQ_TELEGRAM_TOKEN)) ?: throw NullPointerException("CUBETIQ_TELEGRAM_TOKEN is required for Telegram Sender!") + } + + @JvmStatic + fun getReceiver(): String { + return ConfigUtils.getEnv(CUBETIQ_TELEGRAM_RECEIVER, ConfigUtils.getProperty(CUBETIQ_TELEGRAM_RECEIVER, "-360594386")) ?: throw NullPointerException("CUBETIQ_TELEGRAM_RECEIVER is required for Telegram Receiver!") + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramDocument.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramDocument.kt new file mode 100644 index 0000000..bebdab3 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramDocument.kt @@ -0,0 +1,16 @@ +package com.cubetiqs.messaging.client.telegram + +/** + * Telegram Chat Document + * + * @author sombochea + * @since 1.0 + */ +open class TelegramDocument( + val document: TelegramFileDocument? = null, + private val text: String? = null, +) : TelegramMessage { + override fun getText(): String { + return text ?: "" + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramFileDocument.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramFileDocument.kt new file mode 100644 index 0000000..4203660 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramFileDocument.kt @@ -0,0 +1,16 @@ +package com.cubetiqs.messaging.client.telegram + +import java.io.Serializable + +/** + * File Document + * + * @author sombochea + * @since 1.0 + */ +open class TelegramFileDocument ( + var file: ByteArray? = null, + var name: String? = null, + var type: String? = null, + var extension: String? = null, +) : Serializable \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramMessage.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramMessage.kt new file mode 100644 index 0000000..745c8a2 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramMessage.kt @@ -0,0 +1,13 @@ +package com.cubetiqs.messaging.client.telegram + +import java.io.Serializable + +/** + * Telegram Message + * + * @author sombochea + * @since 1.0 + */ +interface TelegramMessage : Serializable { + fun getText(): String +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramProvider.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramProvider.kt new file mode 100644 index 0000000..13167b7 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramProvider.kt @@ -0,0 +1,84 @@ +package com.cubetiqs.messaging.client.telegram + +import com.cubetiqs.messaging.client.provider.MessageProvider +import com.sun.org.slf4j.internal.LoggerFactory +import kotlin.IllegalArgumentException + +/** + * Telegram Provider + * + * @author sombochea + * @since 1.0 + */ +class TelegramProvider : MessageProvider { + private val log = LoggerFactory.getLogger(this::class.java) + private var _token: String = "" + private var _chatId: String = "" + private var _message: TelegramMessage? = null + + fun sendToChatId(chatId: String) = apply { + this._chatId = chatId + } + + fun messageToSend(message: TelegramMessage?) = apply { + this._message = message + } + + fun setBotToken(token: String) = apply { + this._token = token + } + + fun send( + chatId: String, + message: TelegramMessage, + ): TelegramResponse? { + if (_token.isEmpty() || _token.isBlank()) { + throw IllegalArgumentException("token must be provide for send message!") + } + + if (_message?.getText().isNullOrEmpty()) return null + + return try { + val response = TelegramBotUtils.sendMessage( + chatId = chatId, + token = this._token, + text = this._message!!.getText(), + ) + + TelegramResponse( + response = response, + ) + } catch (ex: Exception) { + log.error("[Telegram] Message send error: ${ex.message}!") + null + } + } + + override fun send(): Any? { + if (this._message?.getText().isNullOrEmpty()) { + throw IllegalArgumentException("message must be non-null or non-empty!") + } + + return send(this._chatId, this._message!!) + } + + override fun toString(): String { + return "TelegramProvider(_token='$_token', _chatId='$_chatId', _message=$_message)" + } + + companion object { + @JvmStatic + fun init(token: String): TelegramProvider { + return TelegramProvider() + .setBotToken(token) + } + + @JvmStatic + fun sendMessage(token: String, chatId: String, text: String): Any? { + return init(token) + .sendToChatId(chatId) + .messageToSend(TelegramChatMessage(text)) + .send() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramResponse.kt b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramResponse.kt new file mode 100644 index 0000000..e072b6c --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/telegram/TelegramResponse.kt @@ -0,0 +1,18 @@ +package com.cubetiqs.messaging.client.telegram + +import java.io.Serializable + +/** + * Telegram Response + * + * @author sombochea + * @since 1.0 + */ +class TelegramResponse( + val request: Any? = null, + val response: Any? = null, +) : Serializable { + override fun toString(): String { + return "TelegramResponse(request=$request, response=$response)" + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/util/ConfigUtils.kt b/src/main/kotlin/com/cubetiqs/messaging/client/util/ConfigUtils.kt new file mode 100644 index 0000000..a671000 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/util/ConfigUtils.kt @@ -0,0 +1,13 @@ +package com.cubetiqs.messaging.client.util + +object ConfigUtils { + @JvmStatic + fun getEnv(key: String, defaultValue: String? = null): String? { + return System.getenv(key) ?: defaultValue + } + + @JvmStatic + fun getProperty(key: String, defaultValue: String? = null): String? { + return System.getProperty(key, defaultValue) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/cubetiqs/messaging/client/webclient/WebClientUtils.kt b/src/main/kotlin/com/cubetiqs/messaging/client/webclient/WebClientUtils.kt new file mode 100644 index 0000000..4020d57 --- /dev/null +++ b/src/main/kotlin/com/cubetiqs/messaging/client/webclient/WebClientUtils.kt @@ -0,0 +1,31 @@ +package com.cubetiqs.messaging.client.webclient + +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response + +object WebClientUtils { + private var webClient: OkHttpClient? = null + + private fun getClient(): OkHttpClient { + if (this.webClient == null) { + this.webClient = OkHttpClient() + } + + return this.webClient!! + } + + @JvmStatic + fun makeRequest(request: Request): Response { + val call = getClient().newCall(request) + var response: Response? = null + return try { + response = call.execute() + response + } catch (ex: Exception) { + throw Exception(ex) + } finally { + response?.close() + } + } +} \ No newline at end of file diff --git a/src/main/resources/cubetiq.png b/src/main/resources/cubetiq.png new file mode 100644 index 0000000..9e97bd1 Binary files /dev/null and b/src/main/resources/cubetiq.png differ diff --git a/src/test/java/com/cubetiqs/example/TelegramExampleJavaTests.java b/src/test/java/com/cubetiqs/example/TelegramExampleJavaTests.java new file mode 100644 index 0000000..644d64a --- /dev/null +++ b/src/test/java/com/cubetiqs/example/TelegramExampleJavaTests.java @@ -0,0 +1,48 @@ +package com.cubetiqs.example; + +import com.cubetiqs.messaging.client.telegram.TelegramBotUtils; +import com.cubetiqs.messaging.client.telegram.TelegramConfig; +import com.cubetiqs.messaging.client.telegram.TelegramProvider; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +public final class TelegramExampleJavaTests { + private final String token = TelegramConfig.getToken(); + private final String chatId = TelegramConfig.getReceiver(); + + @Test + public void sendMessage() { + String text = "Hello, Sambo!"; + TelegramBotUtils.sendMessage( + chatId, + text, + token + ); + } + + @Test + public void sendDocument() throws IOException { + String text = "Hello, Sambo with my paper!"; + File file = new File("src/main/resources/cubetiq.png"); + TelegramBotUtils.sendDocument( + chatId, + text, + "my paper.png", + Files.readAllBytes(file.toPath()), + token + ); + } + + @Test + public void sendMessageProvider() { + String text = "Hello, Sambo with Provider!"; + TelegramProvider.sendMessage( + chatId, + text, + token + ); + } +} diff --git a/src/test/kotlin/com/cubetiqs/example/TelegramExampleKotlinTests.kt b/src/test/kotlin/com/cubetiqs/example/TelegramExampleKotlinTests.kt new file mode 100644 index 0000000..9abfdae --- /dev/null +++ b/src/test/kotlin/com/cubetiqs/example/TelegramExampleKotlinTests.kt @@ -0,0 +1,44 @@ +package com.cubetiqs.example + +import com.cubetiqs.messaging.client.telegram.TelegramBotUtils +import com.cubetiqs.messaging.client.telegram.TelegramConfig +import com.cubetiqs.messaging.client.telegram.TelegramProvider +import org.junit.jupiter.api.Test +import java.io.File + +class TelegramExampleKotlinTests { + private val token = TelegramConfig.POS_SYSTEM_ID + private val chatId = "-360594386" + + @Test + fun sendMessage() { + val text = "Hello World" + TelegramBotUtils.sendMessage( + chatId = chatId, + token = token, + text = text, + ) + } + + @Test + fun sendDocument() { + val text = "My document caption" + TelegramBotUtils.sendDocument( + chatId = chatId, + token = token, + text = text, + filename = "my exam paper.png", + document = File("src/main/resources/cubetiq.png").readBytes(), + ) + } + + @Test + fun sendMessageProvider() { + val text = "Hello World from Provider" + TelegramProvider.sendMessage( + chatId = chatId, + token = token, + text = text, + ) + } +} \ No newline at end of file