diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..5dc177e271 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +.idea +out/* +*.iml +target + +settings.xml + +.gradle/ +build/ +out/ diff --git a/CHANGELOG b/CHANGELOG new file mode 100644 index 0000000000..8597f6cc7b --- /dev/null +++ b/CHANGELOG @@ -0,0 +1 @@ +# TelegramBotAPI changelog \ No newline at end of file diff --git a/LICENSE b/LICENSE index 261eeb9e9f..cf01d26fa4 100644 --- a/LICENSE +++ b/LICENSE @@ -178,7 +178,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" + boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2018 Insanus Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index e2227ebccf..8e0e91cef6 100644 --- a/README.md +++ b/README.md @@ -1 +1,26 @@ -# TelegramBotAPI \ No newline at end of file +# TelegramBotAPI + +## What is it? + +It is one more project which wish to be useful and full Telegram Bots API bridge for Kotlin. Most part of some specific +solves or unuseful moments are describing by official [Telegram Bot API](https://core.telegram.org/bots/api). + +## How to work with library? + +By default in any documentation will be meaning that you have variable in scope with names + +| Name of variable | Description | Where to get? (Examples) | +|:----------------:|:-----------:|:------------------------:| +| executor | [RequestsExecutor](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt) | [Ktor RequestExecutor realisation](src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt) | + +## Requests Examples + +### Get Me + +```kotlin +executor.execute(GetMe()) +``` + +As a result you will receive `User` object. This object used as is now (as in API documentation), but it is possible +that this class will be renamed to `RawUser` and you will be able to get real realisation of this object like `Bot` (in +cases when `isBot` == `true`) or `User` (otherwise) diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000000..f48dc7f1f8 --- /dev/null +++ b/build.gradle @@ -0,0 +1,40 @@ +apply plugin: 'java' +apply plugin: "application" +apply plugin: 'kotlin' +apply plugin: 'kotlinx-serialization' + +buildscript { + repositories { + mavenLocal() + jcenter() + mavenCentral() + } + + dependencies { + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-serialization:$kotlin_version" + } +} + +repositories { + mavenLocal() + jcenter() + mavenCentral() + maven { url "https://kotlin.bintray.com/kotlinx" } + maven { url "https://dl.bintray.com/kotlin/ktor" } +} + +dependencies { + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlin_coroutines_version" + implementation "org.jetbrains.kotlinx:kotlinx-serialization-runtime:$kotlin_serialisation_runtime_version" + implementation "joda-time:joda-time:$joda_time_version" + implementation "io.ktor:ktor-client-core:$ktor_version" + implementation "io.ktor:ktor-client-okhttp:$ktor_version" + + // Use JUnit test framework + testImplementation 'junit:junit:4.12' +} + +mainClassName = "com.github.insanusmokrassar.TelegramBotAPI.IndexKt" + diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000000..196d42ab4d --- /dev/null +++ b/gradle.properties @@ -0,0 +1,6 @@ +kotlin.code.style=official +kotlin_version=1.3.11 +kotlin_coroutines_version=1.1.0 +kotlin_serialisation_runtime_version=0.9.1 +joda_time_version=2.10.1 +ktor_version=1.0.1 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000..5971d8fb24 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 0000000000..bdeff908db --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Nov 07 21:46:14 CST 2018 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip diff --git a/gradlew b/gradlew new file mode 100755 index 0000000000..4453ccea33 --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## 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="" + +# 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, switch paths to Windows format before running java +if $cygwin ; 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=$((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" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000000..e95643d6a2 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@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 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= + +@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 init + +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 init + +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 + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +: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 %CMD_LINE_ARGS% + +: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 b/settings.gradle new file mode 100644 index 0000000000..c0b8bff845 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,18 @@ +/* + * This settings file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * In a single project build this file can be empty or even removed. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user guide at https://docs.gradle.org/3.4.1/userguide/multi_project_builds.html + */ + +/* +// To declare projects as part of a multi-project build use the 'include' method +include 'shared' +include 'api' +include 'services:webservice' +*/ + +rootProject.name = 'TelegramBotAPI' diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/Index.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/Index.kt new file mode 100644 index 0000000000..9060345edd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/Index.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI + +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorRequestsExecutor +import com.github.insanusmokrassar.TelegramBotAPI.bot.ProxySettings +import com.github.insanusmokrassar.TelegramBotAPI.bot.useWith +import com.github.insanusmokrassar.TelegramBotAPI.types.message.CommonMessageImpl +import com.github.insanusmokrassar.TelegramBotAPI.requests.get.GetUserProfilePhotos +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.toInputMediaPhoto +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.SendMediaGroup +import com.github.insanusmokrassar.TelegramBotAPI.types.files.biggest +import com.github.insanusmokrassar.TelegramBotAPI.utils.extensions.* +import io.ktor.client.engine.okhttp.OkHttp +import kotlinx.coroutines.runBlocking + +fun main(args: Array) { + runBlocking { + KtorRequestsExecutor( + args[0], + OkHttp.create() + ).apply { + // It is just template of creating requests executor + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/DefaultRequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/DefaultRequestsExecutor.kt new file mode 100644 index 0000000000..dd1ac11d42 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/DefaultRequestsExecutor.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.asCoroutineDispatcher +import java.util.concurrent.Executors + +abstract class BaseRequestsExecutor( + token: String, + hostUrl: String = "https://api.telegram.org" +) : RequestsExecutor { + protected val baseUrl: String = "$hostUrl/bot$token" + + protected val scope: CoroutineScope = CoroutineScope( + Executors.newSingleThreadExecutor().asCoroutineDispatcher() + ) +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorCallFactory.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorCallFactory.kt new file mode 100644 index 0000000000..e2aa6cfaeb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorCallFactory.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall + +interface KtorCallFactory { + suspend fun prepareCall( + client: HttpClient, + baseUrl: String, + request: Request + ) : HttpClientCall? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt new file mode 100644 index 0000000000..7be50995b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/KtorRequestsExecutor.kt @@ -0,0 +1,69 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor + +import com.github.insanusmokrassar.TelegramBotAPI.bot.BaseRequestsExecutor +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base.MultipartRequestCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base.SimpleRequestCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestException +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall +import io.ktor.client.engine.HttpClientEngine +import io.ktor.client.engine.okhttp.OkHttp +import io.ktor.util.cio.toByteArray +import kotlinx.io.charsets.Charset +import kotlinx.serialization.json.JSON + +class KtorRequestsExecutor( + token: String, + private val client: HttpClient = HttpClient(OkHttp), + hostUrl: String = "https://api.telegram.org", + callsFactories: List = emptyList(), + excludeDefaultFactories: Boolean = false +) : BaseRequestsExecutor(token, hostUrl) { + constructor( + token: String, + engine: HttpClientEngine = OkHttp.create(), + hostUrl: String = "https://api.telegram.org" + ) : this( + token, + HttpClient(engine), + hostUrl + ) + + private val callsFactories: List = callsFactories.run { + if (!excludeDefaultFactories) { + asSequence().plus(SimpleRequestCallFactory()).plus(MultipartRequestCallFactory()).toList() + } else { + this + } + } + + override suspend fun execute(request: Request): T { + var call: HttpClientCall? = null + for (factory in callsFactories) { + call = factory.prepareCall( + client, + baseUrl, + request + ) + if (call != null) { + break + } + } + if (call == null) { + throw IllegalArgumentException("Can't execute request: $request") + } + val content = call.response.content.toByteArray().toString(Charset.defaultCharset()) + val responseObject = JSON.parse( + ResponseParameters.serializer(request.resultSerializer()), + content + ) + return responseObject.result ?: call.let { + throw RequestException( + responseObject, + "Can't get result object" + ) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/MultipartRequestCallFactory.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/MultipartRequestCallFactory.kt new file mode 100644 index 0000000000..80c2b5f8df --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/MultipartRequestCallFactory.kt @@ -0,0 +1,51 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base + +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapWithCommonValues +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall +import io.ktor.client.call.call +import io.ktor.client.request.accept +import io.ktor.client.request.forms.MultiPartFormDataContent +import io.ktor.client.request.forms.formData +import io.ktor.client.request.url +import io.ktor.http.* +import kotlinx.io.streams.asInput +import kotlinx.serialization.ImplicitReflectionSerializer + +class MultipartRequestCallFactory : KtorCallFactory { + @ImplicitReflectionSerializer + override suspend fun prepareCall( + client: HttpClient, + baseUrl: String, + request: Request + ): HttpClientCall? = (request as? MultipartRequest) ?.let { + castedRequest -> + client.call { + url("$baseUrl/${castedRequest.method()}") + method = HttpMethod.Post + accept(ContentType.Application.Json) + body = MultiPartFormDataContent( + formData { + val params = castedRequest.paramsJson.mapWithCommonValues() + for ((key, value) in castedRequest.mediaMap + params) { + when (value) { + is MultipartFile -> append( + key, + value.file.inputStream().asInput(), + Headers.build { + append(HttpHeaders.ContentType, value.mimeType) + append(HttpHeaders.ContentDisposition, "filename=${value.fileId}") + } + ) + is FileId -> append(key, value.fileId) + else -> append(key, value.toString()) + } + } + } + ) + build() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/SimpleRequestCallFactory.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/SimpleRequestCallFactory.kt new file mode 100644 index 0000000000..b50a8a83e5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/Ktor/base/SimpleRequestCallFactory.kt @@ -0,0 +1,39 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.base + +import com.github.insanusmokrassar.TelegramBotAPI.bot.Ktor.KtorCallFactory +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls +import io.ktor.client.HttpClient +import io.ktor.client.call.HttpClientCall +import io.ktor.client.call.call +import io.ktor.client.request.accept +import io.ktor.client.request.url +import io.ktor.http.ContentType +import io.ktor.http.HttpMethod +import io.ktor.http.content.TextContent +import kotlinx.serialization.ImplicitReflectionSerializer + +class SimpleRequestCallFactory : KtorCallFactory { + @ImplicitReflectionSerializer + override suspend fun prepareCall( + client: HttpClient, + baseUrl: String, + request: Request + ): HttpClientCall? = (request as? SimpleRequest) ?.let { + castedRequest -> + client.call { + url("$baseUrl/${castedRequest.method()}") + method = HttpMethod.Post + accept(ContentType.Application.Json) + + val content = request.toJsonWithoutNulls().toString() + + body = TextContent( + content, + ContentType.Application.Json + ) + build() + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/ProxySettings.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/ProxySettings.kt new file mode 100644 index 0000000000..1023292e76 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/ProxySettings.kt @@ -0,0 +1,37 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import okhttp3.Credentials +import okhttp3.OkHttpClient +import java.net.InetSocketAddress +import java.net.Proxy + +data class ProxySettings( + val host: String = "localhost", + val port: Int = 1080, + val username: String? = null, + val password: String? = null +) + +fun OkHttpClient.Builder.useWith(proxySettings: ProxySettings) { + proxy( + Proxy( + Proxy.Type.SOCKS, + InetSocketAddress( + proxySettings.host, + proxySettings.port + ) + ) + ) + proxySettings.password ?.let { + password -> + proxyAuthenticator { + _, response -> + response.request().newBuilder().apply { + addHeader( + "Proxy-Authorization", + Credentials.basic(proxySettings.username ?: "", password) + ) + }.build() + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestException.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestException.kt new file mode 100644 index 0000000000..5bba979f4b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestException.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import java.io.IOException + +class RequestException( + val response: ResponseParameters<*>, + message: String? = null, + cause: Throwable? = null +) : IOException( + message, + cause +) \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt new file mode 100644 index 0000000000..467185130b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/bot/RequestsExecutor.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.bot + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request + +interface RequestsExecutor { + @Throws(RequestException::class) + suspend fun execute(request: Request): T +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/DeleteMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/DeleteMessage.kt new file mode 100644 index 0000000000..fdff4adecf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/DeleteMessage.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class DeleteMessage( + @SerialName(chatIdField) + val chatId: ChatIdentifier, + @SerialName(messageIdField) + val messageId: MessageIdentifier +) : SimpleRequest { + override fun method(): String = "deleteMessage" + + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/ForwardMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/ForwardMessage.kt new file mode 100644 index 0000000000..4d0d52d4b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/ForwardMessage.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* + +@Serializable +data class ForwardMessage( + @SerialName(fromChatIdField) + val fromChatId: ChatIdentifier, + @SerialName(chatIdField) + val toChatId: ChatIdentifier, + @SerialName(messageIdField) + val messageId: MessageIdentifier, + @SerialName(disableNotificationField) + @Optional + val disableNotification: Boolean = false +): SimpleRequest { + override fun method(): String = "forwardMessage" + + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt new file mode 100644 index 0000000000..fc958b3c3f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetMe.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.KSerializer + +class GetMe : SimpleRequest { + override fun method(): String = "getMe" + override fun resultSerializer(): KSerializer = User.serializer() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetUpdates.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetUpdates.kt new file mode 100644 index 0000000000..4da6df31b3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/GetUpdates.kt @@ -0,0 +1,50 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.update.RawUpdate +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +const val UPDATE_MESSAGE = "message" +const val UPDATE_EDITED_MESSAGE = "edited_message" +const val UPDATE_CHANNEL_POST = "channel_post" +const val UPDATE_EDITED_CHANNEL_POST = "edited_channel_post" +const val UPDATE_CHOSEN_INLINE_RESULT = "chosen_inline_result" +const val UPDATE_INLINE_QUERY = "inline_query" +const val UPDATE_CALLBACK_QUERY = "callback_query" +const val UPDATE_SHIPPING_QUERY = "shipping_query" +const val UPDATE_PRE_CHECKOUT_QUERY = "pre_checkout_query" +/* + + @Optional private val inline_query: RawInlineQuery? = null, + @Optional private val chosen_inline_result: Unit? = null, + @Optional private val callback_query: RawCallbackQuery? = null, + @Optional private val shipping_query: Unit? = null, + @Optional private val pre_checkout_query: Unit? = null + */ +@Serializable +data class GetUpdates( + @Optional + val offset: UpdateIdentifier? = null,// set `last update id + 1` to receive next part of updates + @Optional + val limit: Int? = null, + @Optional + val timeout: Int? = null, + @Optional + val allowed_updates: List? = listOf( + UPDATE_MESSAGE, + UPDATE_EDITED_MESSAGE, + UPDATE_CHANNEL_POST, + UPDATE_EDITED_CHANNEL_POST, + UPDATE_CHOSEN_INLINE_RESULT, + UPDATE_INLINE_QUERY, + UPDATE_CALLBACK_QUERY, + UPDATE_SHIPPING_QUERY, + UPDATE_PRE_CHECKOUT_QUERY + ) +): SimpleRequest> { + override fun method(): String = "getUpdates" + + override fun resultSerializer(): KSerializer> = ArrayListSerializer(RawUpdate.serializer()) +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/InputFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/InputFile.kt new file mode 100644 index 0000000000..5488db6c0b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/InputFile.kt @@ -0,0 +1,45 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +import kotlinx.serialization.* +import java.io.File +import java.nio.file.Files +import java.util.* + +sealed class InputFile { + abstract val fileId: String +} + +// TODO:: add checks for file url/file id regex +/** + * Contains file id or file url + */ +@Serializable(FileIdSerializer::class) +data class FileId( + override val fileId: String +) : InputFile() + +fun String.toInputFile(): InputFile = FileId(this) + +@Serializer(FileId::class) +object FileIdSerializer : KSerializer { + override fun serialize(output: Encoder, obj: FileId) = output.encodeString(obj.fileId) + override fun deserialize(input: Decoder): FileId = FileId(input.decodeString()) +} + +// TODO:: add checks for files size +/** + * Contains info about file for sending + */ +data class MultipartFile ( + val file: File, + val mimeType: String = Files.probeContentType(file.toPath()), + val filename: String = file.name +) : InputFile() { + override val fileId: String by lazy { + "${UUID.randomUUID()}.${file.extension}" + } +} + +fun File.toInputFile(): InputFile = MultipartFile( + this +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/MultipartRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/MultipartRequest.kt new file mode 100644 index 0000000000..33199b0a07 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/MultipartRequest.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +import kotlinx.serialization.json.JsonObject + +interface MultipartRequest : Request { + val paramsJson: JsonObject + val mediaMap: Map +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/Request.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/Request.kt new file mode 100644 index 0000000000..addf37c658 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/Request.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import com.github.insanusmokrassar.TelegramBotAPI.utils.* +import kotlinx.serialization.* +import kotlinx.serialization.json.JsonObject + +interface Request { + fun method(): String + fun resultSerializer(): KSerializer + @ImplicitReflectionSerializer + fun json(): JsonObject = toJsonWithoutNulls() +} + +fun StringFormat.extractResult( + from: String, + dataSerializer: KSerializer +): ResponseParameters { + return parse(ResponseParameters.serializer(dataSerializer), from) +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/SimpleRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/SimpleRequest.kt new file mode 100644 index 0000000000..b1aab229dd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/SimpleRequest.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts + +interface SimpleRequest : Request diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByInlineMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByInlineMessageId.kt new file mode 100644 index 0000000000..9bf0c75555 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByInlineMessageId.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineMessageIdentifier + +interface ByInlineMessageId { + val inlineMessageId: InlineMessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByMessageId.kt new file mode 100644 index 0000000000..844c1ddfbb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ByMessageId.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier + +interface ByMessageId : ChatRequest { + val messageId: MessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ChatRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ChatRequest.kt new file mode 100644 index 0000000000..e538f3ac14 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ChatRequest.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface ChatRequest { + val chatId: ChatIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableNotification.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableNotification.kt new file mode 100644 index 0000000000..e9feb38ff1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableNotification.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +interface DisableNotification { + val disableNotification: Boolean +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableWebPagePreview.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableWebPagePreview.kt new file mode 100644 index 0000000000..60790ab8c5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/DisableWebPagePreview.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +interface DisableWebPagePreview { + val disableWebPagePreview: Boolean? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMarkup.kt new file mode 100644 index 0000000000..71fc490fc2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMarkup.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup + +interface ReplyMarkup { + val replyMarkup: KeyboardMarkup? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMessageId.kt new file mode 100644 index 0000000000..9c72d3c704 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/ReplyMessageId.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier + +interface ReplyMessageId { + val replyToMessageId: MessageIdentifier? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/UntilDate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/UntilDate.kt new file mode 100644 index 0000000000..3b22c62855 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/abstracts/types/UntilDate.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.TelegramDate + +interface UntilDate { + val untilDate: TelegramDate? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/AnswerCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/AnswerCallbackQuery.kt new file mode 100644 index 0000000000..6eb8b3d1c6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/AnswerCallbackQuery.kt @@ -0,0 +1,35 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.CallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class AnswerCallbackQuery( + @SerialName(callbackQueryIdField) + val callbackQueryId: CallbackQueryIdentifier, + @SerialName(textField) + @Optional + val text: String? = null, + @SerialName(showAlertField) + @Optional + val showAlert: Boolean? = null, + @SerialName(urlField) + @Optional + val url: String? = null, + @SerialName(cachedTimeField) + @Optional + val cachedTimeSeconds: Int? = null +) : SimpleRequest { + override fun method(): String = "answerCallbackQuery" + override fun resultSerializer(): KSerializer = BooleanSerializer +} + +fun CallbackQuery.createAnswer( + text: String? = null, + showAlert: Boolean? = null, + url: String? = null, + cachedTimeSeconds: Int? = null +): AnswerCallbackQuery = AnswerCallbackQuery(id, text, showAlert, url, cachedTimeSeconds) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerPreCheckoutQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerPreCheckoutQuery.kt new file mode 100644 index 0000000000..4eb4a896da --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerPreCheckoutQuery.kt @@ -0,0 +1,39 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments + +import com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts.AnswerPreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class AnswerPreCheckoutQueryOk( + @SerialName(preCheckoutQueryIdField) + override val preCheckoutQueryId: PreCheckoutQueryId +) : AnswerPreCheckoutQuery { + @SerialName(okField) + override val isOk: Boolean = true +} + + +@Serializable +data class AnswerPreCheckoutQueryError( + @SerialName(preCheckoutQueryIdField) + override val preCheckoutQueryId: PreCheckoutQueryId, + @SerialName(errorMessageField) + val errorMessage: String +) : AnswerPreCheckoutQuery { + @SerialName(okField) + override val isOk: Boolean = false +} + +fun PreCheckoutQuery.createAnswerOk(): AnswerPreCheckoutQueryOk = AnswerPreCheckoutQueryOk( + id +) + +fun PreCheckoutQuery.createAnswerError( + error: String +): AnswerPreCheckoutQueryError = AnswerPreCheckoutQueryError( + id, + error +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerShippingQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerShippingQuery.kt new file mode 100644 index 0000000000..1aa62665f8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/AnswerShippingQuery.kt @@ -0,0 +1,49 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments + +import com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts.AnswerShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingOption +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class AnswerShippingQueryOk( + @SerialName(shippingQueryIdField) + override val shippingQueryId: ShippingQueryIdentifier, + @Serializable(ShippingOptionsSerializer::class) + @SerialName(shippingOptionsField) + val shippingOptions: List +) : AnswerShippingQuery { + @SerialName(okField) + override val isOk: Boolean = true +} + +object ShippingOptionsSerializer : KSerializer> by ArrayListSerializer( + ShippingOption.serializer() +) + +@Serializable +data class AnswerShippingQueryError( + @SerialName(shippingQueryIdField) + override val shippingQueryId: ShippingQueryIdentifier, + @SerialName(errorMessageField) + val error: String +) : AnswerShippingQuery { + @SerialName(okField) + override val isOk: Boolean = false +} + +fun ShippingQuery.createAnswerOk( + shippingOptions: List +): AnswerShippingQueryOk = AnswerShippingQueryOk( + id, + shippingOptions +) + +fun ShippingQuery.createAnswerError( + error: String +): AnswerShippingQueryError = AnswerShippingQueryError( + id, + error +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerPreCheckoutQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerPreCheckoutQuery.kt new file mode 100644 index 0000000000..b1b38da42b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerPreCheckoutQuery.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.PreCheckoutQueryId +import kotlinx.serialization.KSerializer +import kotlinx.serialization.serializer + +interface AnswerPreCheckoutQuery : SimpleRequest { + override fun method(): String = "answerPreCheckoutQuery" + override fun resultSerializer(): KSerializer = Boolean.serializer() + + val preCheckoutQueryId: PreCheckoutQueryId + val isOk: Boolean +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerShippingQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerShippingQuery.kt new file mode 100644 index 0000000000..2888ef05a4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/answers/payments/abstracts/AnswerShippingQuery.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.answers.payments.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ShippingQueryIdentifier +import kotlinx.serialization.KSerializer +import kotlinx.serialization.serializer + +interface AnswerShippingQuery : SimpleRequest { + override fun method(): String = "answerShippingQuery" + override fun resultSerializer(): KSerializer = Boolean.serializer() + + val shippingQueryId: ShippingQueryIdentifier + val isOk: Boolean +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/ExportChatInviteLink.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/ExportChatInviteLink.kt new file mode 100644 index 0000000000..d88cdbd862 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/ExportChatInviteLink.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class ExportChatInviteLink( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "exportChatInviteLink" + override fun resultSerializer(): KSerializer = StringSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/LeaveChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/LeaveChat.kt new file mode 100644 index 0000000000..2f8b66f55d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/LeaveChat.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class LeaveChat( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "leaveChat" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/UnpinChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/UnpinChatMessage.kt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/abstracts/ChatMemberRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/abstracts/ChatMemberRequest.kt new file mode 100644 index 0000000000..afa4ab863c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/abstracts/ChatMemberRequest.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface ChatMemberRequest : ChatRequest, SimpleRequest { + val userId: UserId +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChat.kt new file mode 100644 index 0000000000..d8ab733578 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChat.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.RawChat +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class GetChat( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "getChat" + override fun resultSerializer(): KSerializer = RawChat.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatAdministrators.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatAdministrators.kt new file mode 100644 index 0000000000..e1ceb4cc60 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatAdministrators.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.RawChatMember +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.RawChat +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.* + +@Serializable +data class GetChatAdministrators( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest> { + override fun method(): String = "getChatAdministrators" + override fun resultSerializer(): KSerializer> = ArrayListSerializer(RawChatMember.serializer()) +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatMembersCount.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatMembersCount.kt new file mode 100644 index 0000000000..4bb43799c2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/get/GetChatMembersCount.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.* + +@Serializable +data class GetChatMembersCount( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "getChatMembersCount" + override fun resultSerializer(): KSerializer = IntSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/GetChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/GetChatMember.kt new file mode 100644 index 0000000000..df40b239db --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/GetChatMember.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember.RawChatMember +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class GetChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId +) : ChatMemberRequest { + override fun method(): String = "getChatMember" + override fun resultSerializer(): KSerializer = RawChatMember.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/KickChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/KickChatMember.kt new file mode 100644 index 0000000000..d6c9db5775 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/KickChatMember.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class KickChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId, + @SerialName(untilDateField) + @Optional + override val untilDate: TelegramDate? = null +) : ChatMemberRequest, UntilDate { + override fun method(): String = "kickChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/PromoteChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/PromoteChatMember.kt new file mode 100644 index 0000000000..599834c976 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/PromoteChatMember.kt @@ -0,0 +1,45 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class PromoteChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId, + @SerialName(untilDateField) + @Optional + override val untilDate: TelegramDate? = null, + @SerialName(canChangeInfoField) + @Optional + private val canChangeInfo: Boolean? = null, + @SerialName(canPostMessagesField) + @Optional + private val canPostMessages: Boolean? = null, + @SerialName(canEditMessagesField) + @Optional + private val canEditMessages: Boolean? = null, + @SerialName(canDeleteMessagesField) + @Optional + private val canDeleteMessages: Boolean? = null, + @SerialName(canInviteUsersField) + @Optional + private val canInviteUsers: Boolean? = null, + @SerialName(canRestrictMembersField) + @Optional + private val canRestrictMembers: Boolean? = null, + @SerialName(canPinMessagesField) + @Optional + private val canPinMessages: Boolean? = null, + @SerialName(canPromoteMembersField) + @Optional + private val canPromoteMembers: Boolean? = null +) : ChatMemberRequest, UntilDate { + override fun method(): String = "promoteChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/RestrictChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/RestrictChatMember.kt new file mode 100644 index 0000000000..6706b899b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/RestrictChatMember.kt @@ -0,0 +1,33 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class RestrictChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId, + @SerialName(untilDateField) + @Optional + override val untilDate: TelegramDate? = null, + @SerialName(canSendMessagesField) + @Optional + private val canSendMessages: Boolean? = null, + @SerialName(canSendMediaMessagesField) + @Optional + private val canSendMediaMessages: Boolean? = null, + @SerialName(canSendOtherMessagesField) + @Optional + private val canSendOtherMessages: Boolean? = null, + @SerialName(canAddWebPagePreviewsField) + @Optional + private val canAddWebPagePreviews: Boolean? = null +) : ChatMemberRequest, UntilDate { + override fun method(): String = "restrictChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/UnbanChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/UnbanChatMember.kt new file mode 100644 index 0000000000..70492e7f8c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/members/UnbanChatMember.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.members + +import com.github.insanusmokrassar.TelegramBotAPI.requests.chat.abstracts.ChatMemberRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class UnbanChatMember( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(userIdField) + override val userId: UserId +) : ChatMemberRequest { + override fun method(): String = "unbanChatMember" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/DeleteChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/DeleteChatPhoto.kt new file mode 100644 index 0000000000..3bec4c4317 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/DeleteChatPhoto.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class DeleteChatPhoto( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "deleteChatPhoto" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/PinChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/PinChatMessage.kt new file mode 100644 index 0000000000..93ad6d990c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/PinChatMessage.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.DisableNotification +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class PinChatMessage ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + val messageId: MessageIdentifier, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false +): ChatRequest, SimpleRequest, DisableNotification { + override fun method(): String = "pinChatMessage" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatDescription.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatDescription.kt new file mode 100644 index 0000000000..53cd8aac9f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatDescription.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetChatDescription ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(descriptionField) + val description: String +): ChatRequest, SimpleRequest { + init { + if (description.length !in chatDescriptionLength) { + throw IllegalArgumentException("Chat description must be in $chatDescriptionLength range") + } + } + + override fun method(): String = "setChatDescription" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatPhoto.kt new file mode 100644 index 0000000000..59934570ac --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatPhoto.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.JsonTreeMapper + +@Serializable +data class SetChatPhoto ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @Transient + val photo: MultipartFile = throw IllegalArgumentException("Unfortunately, this type of objects can't be parsed automatically") +): ChatRequest, MultipartRequest { + override fun method(): String = "setChatPhoto" + override fun resultSerializer(): KSerializer = BooleanSerializer + override val mediaMap: Map = mapOf(photoField to photo) + override val paramsJson: JsonObject = JsonTreeMapper().writeTree(this, serializer()).jsonObject +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatTitle.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatTitle.kt new file mode 100644 index 0000000000..e288d4701e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/SetChatTitle.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetChatTitle ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(titleField) + val title: String +): ChatRequest, SimpleRequest { + init { + if (title.length !in chatTitleLength) { + throw IllegalArgumentException("Chat title must be in $chatTitleLength range") + } + } + + override fun method(): String = "setChatTitle" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/UnpinChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/UnpinChatMessage.kt new file mode 100644 index 0000000000..3b6538712d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/modify/UnpinChatMessage.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.modify + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chatIdField +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer +import kotlinx.serialization.internal.StringSerializer + +@Serializable +data class UnpinChatMessage( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "unpinChatMessage" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/DeleteChatStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/DeleteChatStickerSet.kt new file mode 100644 index 0000000000..af90e60f30 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/DeleteChatStickerSet.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class DeleteChatStickerSet( + @SerialName(chatIdField) + override val chatId: ChatIdentifier +): ChatRequest, SimpleRequest { + override fun method(): String = "deleteChatStickerSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/SetChatStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/SetChatStickerSet.kt new file mode 100644 index 0000000000..207895dc4c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/chat/stickers/SetChatStickerSet.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.chat.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetChatStickerSet( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(stickerSetNameField) + val stickerSetName: String +): ChatRequest, SimpleRequest { + override fun method(): String = "setChatStickerSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/common/CommonMultipartFileRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/common/CommonMultipartFileRequest.kt new file mode 100644 index 0000000000..efa5240cbd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/common/CommonMultipartFileRequest.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.common + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.json.JsonObject + +data class CommonMultipartFileRequest( + val data: Request, + override val mediaMap: Map +) : MultipartRequest, Request by data { + @ImplicitReflectionSerializer + override val paramsJson: JsonObject = data.json() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditChatMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditChatMessageLiveLocation.kt new file mode 100644 index 0000000000..eb0a780abd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditChatMessageLiveLocation.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class EditChatMessageLiveLocation( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(latitudeField) + override val latitude: Double, + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage, EditLocationMessage { + override fun method(): String = "editMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditInlineMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditInlineMessageLiveLocation.kt new file mode 100644 index 0000000000..cc8bf27f6b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/EditInlineMessageLiveLocation.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class EditInlineMessageLiveLocation( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(latitudeField) + override val latitude: Double, + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage, EditLocationMessage { + override fun method(): String = "editMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopChatMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopChatMessageLiveLocation.kt new file mode 100644 index 0000000000..b5e9c2d11d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopChatMessageLiveLocation.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class StopChatMessageLiveLocation( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage { + override fun method(): String = "stopMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopInlineMessageLiveLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopInlineMessageLiveLocation.kt new file mode 100644 index 0000000000..64bf13498a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/LiveLocation/StopInlineMessageLiveLocation.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.LiveLocation + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +// TODO:: Replace return type by RawMessage or Boolean (as in documentation) +@Serializable +data class StopInlineMessageLiveLocation( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage { + override fun method(): String = "stopMessageLiveLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditChatMessageReplyMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditChatMessageReplyMarkup.kt new file mode 100644 index 0000000000..9b3ddc3979 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditChatMessageReplyMarkup.kt @@ -0,0 +1,25 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.ReplyMarkup + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditChatMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage +import kotlinx.serialization.* + +const val editMessageReplyMarkupMethod = "editMessageReplyMarkup" + +@Serializable +data class EditChatMessageReplyMarkup( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage { + + override fun method(): String = editMessageReplyMarkupMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditInlineMessageReplyMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditInlineMessageReplyMarkup.kt new file mode 100644 index 0000000000..0ac7ddd734 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/ReplyMarkup/EditInlineMessageReplyMarkup.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.ReplyMarkup + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditInlineMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.EditReplyMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class EditInlineMessageReplyMarkup( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage { + + override fun method(): String = editMessageReplyMarkupMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditChatMessage.kt new file mode 100644 index 0000000000..7fd82be401 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditChatMessage.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest + +interface EditChatMessage : SimpleRequest { + val chatId: ChatIdentifier + val messageId: MessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditDisableWebPagePreviewMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditDisableWebPagePreviewMessage.kt new file mode 100644 index 0000000000..0dd745574c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditDisableWebPagePreviewMessage.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +interface EditDisableWebPagePreviewMessage { + val disableWebPagePreview: Boolean? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditInlineMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditInlineMessage.kt new file mode 100644 index 0000000000..e20a5d9083 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditInlineMessage.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineMessageIdentifier + +interface EditInlineMessage : SimpleRequest { + val inlineMessageId: InlineMessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditLocationMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditLocationMessage.kt new file mode 100644 index 0000000000..a7b8cc8a9b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditLocationMessage.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +interface EditLocationMessage { + val latitude: Double + val longitude: Double +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditMediaMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditMediaMessage.kt new file mode 100644 index 0000000000..8f1cb3be3c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditMediaMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia + +interface EditMediaMessage { + val media: InputMedia +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditReplyMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditReplyMessage.kt new file mode 100644 index 0000000000..94fcf34ff6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditReplyMessage.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup + +interface EditReplyMessage : ReplyMarkup { + override val replyMarkup: InlineKeyboardMarkup? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditTextChatMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditTextChatMessage.kt new file mode 100644 index 0000000000..01a413ed18 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/abstracts/EditTextChatMessage.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest + +interface EditTextChatMessage : SimpleRequest { + val text: String + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditChatMessageCaption.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditChatMessageCaption.kt new file mode 100644 index 0000000000..6c2fc8ad94 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditChatMessageCaption.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.caption + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +const val editMessageCaptionMethod = "editMessageCaption" + +@Serializable +data class EditChatMessageCaption( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(captionField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditTextChatMessage, EditReplyMessage { + + override fun method(): String = editMessageCaptionMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditInlineMessageCaption.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditInlineMessageCaption.kt new file mode 100644 index 0000000000..afb40f83a3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/caption/EditInlineMessageCaption.kt @@ -0,0 +1,27 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.caption + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class EditInlineMessageCaption( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(captionField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditTextChatMessage, EditReplyMessage { + + override fun method(): String = editMessageCaptionMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditChatMessageMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditChatMessageMedia.kt new file mode 100644 index 0000000000..24fa044895 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditChatMessageMedia.kt @@ -0,0 +1,35 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia +import kotlinx.serialization.* +import java.lang.IllegalArgumentException + +const val editMessageMediaMethod = "editMessageMedia" + +@Serializable +data class EditChatMessageMedia( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(mediaField) + override val media: InputMedia, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditReplyMessage, EditMediaMessage { + + init { + if (media.file is MultipartFile) { + throw IllegalArgumentException("For editing of media messages you MUST use file id (according to documentation)") + } + } + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditInlineMessageMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditInlineMessageMedia.kt new file mode 100644 index 0000000000..64e1f3af0b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/media/EditInlineMessageMedia.kt @@ -0,0 +1,32 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.text + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media.editMessageMediaMethod +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.InputMedia +import kotlinx.serialization.* +import java.lang.IllegalArgumentException + +@Serializable +data class EditInlineMessageMedia( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(mediaField) + override val media: InputMedia, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditReplyMessage, EditMediaMessage { + + init { + if (media.file is MultipartFile) { + throw IllegalArgumentException("For editing of media messages you MUST use file id (according to documentation)") + } + } + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditChatMessageText.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditChatMessageText.kt new file mode 100644 index 0000000000..53898228bd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditChatMessageText.kt @@ -0,0 +1,35 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.text + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media.editMessageMediaMethod +import kotlinx.serialization.* + +const val editMessageTextMethod = "editMessageText" + +@Serializable +data class EditChatMessageText( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(textField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(disableWebPagePreviewField) + @Optional + override val disableWebPagePreview: Boolean? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditChatMessage, EditTextChatMessage, EditReplyMessage, EditDisableWebPagePreviewMessage { + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditInlineMessageText.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditInlineMessageText.kt new file mode 100644 index 0000000000..29e7367eaa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/edit/text/EditInlineMessageText.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.edit.text + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.edit.media.editMessageMediaMethod +import kotlinx.serialization.* + +@Serializable +data class EditInlineMessageText( + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(textField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(disableWebPagePreviewField) + @Optional + override val disableWebPagePreview: Boolean? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : EditInlineMessage, EditTextChatMessage, EditReplyMessage, EditDisableWebPagePreviewMessage { + + override fun method(): String = editMessageMediaMethod + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByChat.kt new file mode 100644 index 0000000000..bbc42ff686 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByChat.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.GetGameHighScores +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetGameHighScoresByChat ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(chatIdField) + override val chatId: ChatId, + @SerialName(messageIdField) + override val messageId: MessageIdentifier +) : GetGameHighScores, ByMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByInlineMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByInlineMessageId.kt new file mode 100644 index 0000000000..6d9d8cae81 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/GetGameHighScoresByInlineMessageId.kt @@ -0,0 +1,15 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByInlineMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.GetGameHighScores +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetGameHighScoresByInlineMessageId ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier +) : GetGameHighScores, ByInlineMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByChatId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByChatId.kt new file mode 100644 index 0000000000..e6a96cccb7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByChatId.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.SetGameScore +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class SetGameScoreByChatId ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(scoreField) + override val score: Long, + @SerialName(chatIdField) + override val chatId: ChatId, + @SerialName(messageIdField) + override val messageId: MessageIdentifier, + @SerialName(forceField) + @Optional + override val force: Boolean = false, + @SerialName(disableEditMessageField) + @Optional + override val disableEditMessage: Boolean = false +) : SetGameScore, ByMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByInlineMessageId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByInlineMessageId.kt new file mode 100644 index 0000000000..efd78d4563 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/SetGameScoreByInlineMessageId.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ByInlineMessageId +import com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts.SetGameScore +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class SetGameScoreByInlineMessageId ( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(scoreField) + override val score: Long, + @SerialName(inlineMessageIdField) + override val inlineMessageId: InlineMessageIdentifier, + @SerialName(forceField) + @Optional + override val force: Boolean = false, + @SerialName(disableEditMessageField) + @Optional + override val disableEditMessage: Boolean = false +) : SetGameScore, ByInlineMessageId diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/GetGameHighScores.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/GetGameHighScores.kt new file mode 100644 index 0000000000..e0499783eb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/GetGameHighScores.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.UserId +import com.github.insanusmokrassar.TelegramBotAPI.types.games.GameHighScore +import kotlinx.serialization.KSerializer +import kotlinx.serialization.internal.ArrayListSerializer + +interface GetGameHighScores : SimpleRequest> { + val userId: UserId + + override fun method(): String = "getGameHighScores" + override fun resultSerializer(): KSerializer> = GameHighScoresSerializer +} + +object GameHighScoresSerializer : KSerializer> by ArrayListSerializer(GameHighScore.serializer()) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/SetGameScore.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/SetGameScore.kt new file mode 100644 index 0000000000..5ba912b016 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/games/abstracts/SetGameScore.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.games.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.UserId +import kotlinx.serialization.KSerializer +import kotlinx.serialization.serializer + +interface SetGameScore : SimpleRequest { + val userId: UserId + val score: Long + val force: Boolean + val disableEditMessage: Boolean + + override fun method(): String = "setGameScore" + override fun resultSerializer(): KSerializer = Boolean.serializer() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetFile.kt new file mode 100644 index 0000000000..ca27a73746 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetFile.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.get + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PathedFile +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.fileIdField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* + +@Serializable +data class GetFile( + @SerialName(fileIdField) + val fileId: FileId +): SimpleRequest { + override fun method(): String = "getFile" + override fun resultSerializer(): KSerializer = PathedFile.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetStickerSet.kt new file mode 100644 index 0000000000..b183a9671e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetStickerSet.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.get + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.stickerSetNameField +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.StickerSet +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GetStickerSet( + @SerialName(stickerSetNameField) + val name: String +): SimpleRequest { + override fun method(): String = "getStickerSet" + override fun resultSerializer(): KSerializer = StickerSet.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetUserProfilePhotos.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetUserProfilePhotos.kt new file mode 100644 index 0000000000..83f95a29cd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/get/GetUserProfilePhotos.kt @@ -0,0 +1,27 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.get + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import kotlinx.serialization.* + +@Serializable +data class GetUserProfilePhotos( + @SerialName(userIdField) + val userId: UserId, + @SerialName(offsetField) + val offset: Int? = null, + @SerialName(limitField) + val limit: Int? = null +): SimpleRequest { + init { + if (offset != null && offset < 0) { + throw IllegalArgumentException("Offset for getting user profile photos must be positive") + } + if (limit != null && limit !in userProfilePhotosRequestLimit) { + throw IllegalArgumentException("Limit for getting user profile photos must be in 0 .. 100 range") + } + } + + override fun method(): String = "getUserProfilePhotos" + override fun resultSerializer(): KSerializer = UserProfilePhotos.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendAction.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendAction.kt new file mode 100644 index 0000000000..23e73fb89a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendAction.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.actions.BotAction +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendChatMessageRequest +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +/** + * Send notification to user which will be shown for 5 seconds or while user have no messages from bot + */ +@Serializable +data class SendAction( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(actionField) + val action: BotAction +): SendChatMessageRequest { + override fun method(): String = "sendChatAction" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendContact.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendContact.kt new file mode 100644 index 0000000000..9850ec5ff5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendContact.kt @@ -0,0 +1,63 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class SendContact( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(phoneNumberField) + val phoneNumber: String, + @SerialName(firstNameField) + val firstName: String, + @SerialName(lastNameField) + @Optional + val lastName: String? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : SendMessageRequest, + ReplyingMarkupSendMessageRequest +{ + constructor( + chatId: ChatIdentifier, + contact: Contact, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null + ): this( + chatId, + contact.phoneNumber, + contact.firstName, + contact.lastName, + disableNotification, + replyToMessageId, + replyMarkup + ) + + override fun method(): String = "sendVenue" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +fun Contact.toRequest( + chatId: ChatIdentifier, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): SendContact = SendContact( + chatId, + this, + disableNotification, + replyToMessageId, + replyMarkup +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendLocation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendLocation.kt new file mode 100644 index 0000000000..a596500970 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendLocation.kt @@ -0,0 +1,37 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import kotlinx.serialization.* + +// TODO:: Add location tracker for tracking location +@Serializable +data class SendLocation( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(latitudeField) + override val latitude: Double, + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(livePeriodField) + @Optional + val livePeriod: Long? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : SendMessageRequest, + ReplyingMarkupSendMessageRequest, + PositionedSendMessageRequest +{ + + override fun method(): String = "sendLocation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendMessage.kt new file mode 100644 index 0000000000..be39134045 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendMessage.kt @@ -0,0 +1,41 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.DisableWebPagePreview +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class SendMessage( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(textField) + override val text: String, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(disableWebPagePreviewField) + @Optional + override val disableWebPagePreview: Boolean? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + DisableWebPagePreview +{ + + override fun method(): String = "sendMessage" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendVenue.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendVenue.kt new file mode 100644 index 0000000000..30506e5509 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/SendVenue.kt @@ -0,0 +1,71 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class SendVenue( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(latitudeField) + override val latitude: Double, + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(titleField) + override val title: String, + @SerialName(addressField) + val address: String, + @SerialName(foursquareIdField) + @Optional + val foursquareId: String? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : SendMessageRequest, + PositionedSendMessageRequest, + TitledSendMessageRequest, + ReplyingMarkupSendMessageRequest +{ + constructor( + chatId: ChatIdentifier, + venue: Venue, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null + ): this( + chatId, + venue.location.latitude, + venue.location.longitude, + venue.title, + venue.address, + venue.foursquareId, + disableNotification, + replyToMessageId, + replyMarkup + ) + + override fun method(): String = "sendVenue" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +fun Venue.toRequest( + chatId: ChatIdentifier, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): SendVenue = SendVenue( + chatId, + this, + disableNotification, + replyToMessageId, + replyMarkup +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/DuratedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/DuratedSendMessageRequest.kt new file mode 100644 index 0000000000..43c746c2fb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/DuratedSendMessageRequest.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface DuratedSendMessageRequest: SendMessageRequest { + /** + * Duration of media, usually in seconds + */ + val duration: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/PositionedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/PositionedSendMessageRequest.kt new file mode 100644 index 0000000000..f538b7e378 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/PositionedSendMessageRequest.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface PositionedSendMessageRequest: SendMessageRequest { + val latitude: Double + val longitude: Double +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ReplyingMarkupSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ReplyingMarkupSendMessageRequest.kt new file mode 100644 index 0000000000..adcfaeff88 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ReplyingMarkupSendMessageRequest.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMarkup + +interface ReplyingMarkupSendMessageRequest: SendMessageRequest, ReplyMarkup \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendChatMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendChatMessageRequest.kt new file mode 100644 index 0000000000..56ed3cb4d6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendChatMessageRequest.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ChatRequest + +interface SendChatMessageRequest : SimpleRequest, ChatRequest \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendMessageRequest.kt new file mode 100644 index 0000000000..31ea67cf0a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SendMessageRequest.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.DisableNotification +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMessageId + +interface SendMessageRequest : SendChatMessageRequest, ReplyMessageId, DisableNotification diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SizedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SizedSendMessageRequest.kt new file mode 100644 index 0000000000..d95b2c5930 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/SizedSendMessageRequest.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface SizedSendMessageRequest : SendMessageRequest { + val width: Int? + val height: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TextableSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TextableSendMessageRequest.kt new file mode 100644 index 0000000000..a34f8df3d8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TextableSendMessageRequest.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode + +interface TextableSendMessageRequest: SendMessageRequest { + val text: String? + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ThumbedSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ThumbedSendMessageRequest.kt new file mode 100644 index 0000000000..3597137c56 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/ThumbedSendMessageRequest.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface ThumbedSendMessageRequest: SendMessageRequest { + val thumb: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TitledSendMessageRequest.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TitledSendMessageRequest.kt new file mode 100644 index 0000000000..144a234f52 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/abstracts/TitledSendMessageRequest.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts + +interface TitledSendMessageRequest: SendMessageRequest { + val title: String? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/games/SendGame.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/games/SendGame.kt new file mode 100644 index 0000000000..8de32c9618 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/games/SendGame.kt @@ -0,0 +1,33 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.games + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.ReplyMarkup +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.ReplyingMarkupSendMessageRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import kotlinx.serialization.KSerializer +import kotlinx.serialization.Optional +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SendGame ( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(gameShortNameField) + val gameShortName: String, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : SendMessageRequest, + ReplyMarkup { + override fun method(): String = "sendGame" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAnimation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAnimation.kt new file mode 100644 index 0000000000..f4842d455c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAnimation.kt @@ -0,0 +1,109 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull +import kotlinx.serialization.* + +fun SendAnimation( + chatId: ChatIdentifier, + animation: InputFile, + thumb: InputFile?, + caption: String? = null, + parseMode: ParseMode? = null, + duration: Int? = null, + width: Int? = null, + height: Int? = null, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request { + val animationAsFileId = (animation as? FileId) ?.fileId + val animationAsFile = animation as? MultipartFile + val thumbAsFileId = (thumb as? FileId) ?.fileId + val thumbAsFile = thumb as? MultipartFile + + val data = SendAnimationData( + chatId, + animationAsFileId, + thumbAsFileId, + caption, + parseMode, + duration, + width, + height, + disableNotification, + replyToMessageId, + replyMarkup + ) + + return if (animationAsFile == null && thumbAsFile == null) { + data + } else { + MultipartRequestImpl( + data, + SendAnimationFiles(animationAsFile, thumbAsFile) + ) + } +} + +@Serializable +data class SendAnimationData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(animationField) + @Optional + val animation: String? = null, + @SerialName(thumbField) + @Optional + override val thumb: String? = null, + @SerialName(captionField) + @Optional + override val text: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(durationField) + @Optional + override val duration: Int? = null, + @SerialName(widthField) + @Optional + override val width: Int? = null, + @SerialName(heightField) + @Optional + override val height: Int? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : Data, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest, + SizedSendMessageRequest +{ + + override fun method(): String = "sendAnimation" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendAnimationFiles internal constructor( + val animation: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + animationField to animation, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAudio.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAudio.kt new file mode 100644 index 0000000000..5f19b644fb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendAudio.kt @@ -0,0 +1,109 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull +import kotlinx.serialization.* + +fun SendAudio( + chatId: ChatIdentifier, + audio: InputFile, + thumb: InputFile?, + caption: String? = null, + parseMode: ParseMode? = null, + duration: Int? = null, + performer: String? = null, + title: String? = null, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request { + val audioAsFileId = (audio as? FileId) ?.fileId + val audioAsFile = audio as? MultipartFile + val thumbAsFileId = (thumb as? FileId) ?.fileId + val thumbAsFile = thumb as? MultipartFile + + val data = SendAudioData( + chatId, + audioAsFileId, + thumbAsFileId, + caption, + parseMode, + duration, + performer, + title, + disableNotification, + replyToMessageId, + replyMarkup + ) + + return if (audioAsFile == null && thumbAsFile == null) { + data + } else { + MultipartRequestImpl( + data, + SendAudioFiles(audioAsFile, thumbAsFile) + ) + } +} + +@Serializable +data class SendAudioData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(audioField) + @Optional + val audio: String? = null, + @SerialName(thumbField) + @Optional + override val thumb: String? = null, + @SerialName(captionField) + @Optional + override val text: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(durationField) + @Optional + override val duration: Int? = null, + @SerialName(performerField) + @Optional + val performer: String? = null, + @SerialName(titleField) + @Optional + override val title: String? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : Data, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + TitledSendMessageRequest, + DuratedSendMessageRequest +{ + + override fun method(): String = "sendAudio" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendAudioFiles internal constructor( + val audio: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + audioField to audio, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendDocument.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendDocument.kt new file mode 100644 index 0000000000..b98ce44d00 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendDocument.kt @@ -0,0 +1,92 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull +import kotlinx.serialization.* + +fun SendDocument( + chatId: ChatIdentifier, + document: InputFile, + thumb: InputFile?, + caption: String? = null, + parseMode: ParseMode? = null, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request { + val documentAsFileId = (document as? FileId) ?.fileId + val documentAsFile = document as? MultipartFile + val thumbAsFileId = (thumb as? FileId) ?.fileId + val thumbAsFile = thumb as? MultipartFile + + val data = SendDocumentData( + chatId, + documentAsFileId, + thumbAsFileId, + caption, + parseMode, + disableNotification, + replyToMessageId, + replyMarkup + ) + + return if (documentAsFile == null && thumbAsFile == null) { + data + } else { + MultipartRequestImpl( + data, + SendDocumentFiles(documentAsFile, thumbAsFile) + ) + } +} + +@Serializable +data class SendDocumentData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(documentField) + @Optional + val document: String? = null, + @SerialName(thumbField) + @Optional + override val thumb: String? = null, + @SerialName(captionField) + @Optional + override val text: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : Data, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest +{ + + override fun method(): String = "sendDocument" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendDocumentFiles internal constructor( + val document: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + documentField to document, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt new file mode 100644 index 0000000000..247edf9975 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendMediaGroup.kt @@ -0,0 +1,90 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.MediaGroupMemberInputMedia +import com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia.ThumbedInputMedia +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer +import kotlinx.serialization.json.jsonArray + +val membersCountInMediaGroup: IntRange = 2 .. 10 + +fun SendMediaGroup( + chatId: ChatIdentifier, + media: List, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null +): Request> { + if (media.size !in membersCountInMediaGroup) { + throw IllegalArgumentException("Count of members for media group must be in $membersCountInMediaGroup range") + } + + val files: List = media.flatMap { + listOfNotNull( + it.file as? MultipartFile, + if (it is ThumbedInputMedia) { + it.thumb as? MultipartFile + } else { + null + } + ) + } + + val data = SendMediaGroupData( + chatId, + media, + disableNotification, + replyToMessageId + ) + + return if (files.isEmpty()) { + data + } else { + MultipartRequestImpl( + data, + SendMediaGroupFiles(files) + ) + } +} + +private val serializer = ArrayListSerializer(RawMessage.serializer()) + +@Serializable +data class SendMediaGroupData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @Transient + val media: List = emptyList(), + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null +) : Data>, + SendMessageRequest> +{ + // TODO:: fix this nail when kotlin serialisation will support + @ImplicitReflectionSerializer + @SerialName(mediaField) + private val convertedMedia: String + get() = jsonArray { + media.forEach { + +it.toJsonWithoutNulls() + } + }.toString() + + + override fun method(): String = "sendMediaGroup" + override fun resultSerializer(): KSerializer> = serializer +} + +data class SendMediaGroupFiles internal constructor( + val files: List +) : Files by (files.map { it.fileId to it }.toMap()) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendPhoto.kt new file mode 100644 index 0000000000..6cbcfa39e5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendPhoto.kt @@ -0,0 +1,74 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import kotlinx.serialization.* + +fun SendPhoto( + chatId: ChatIdentifier, + photo: InputFile, + caption: String? = null, + parseMode: ParseMode? = null, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request { + val data = SendPhotoData( + chatId, + (photo as? FileId) ?.fileId, + caption, + parseMode, + disableNotification, + replyToMessageId, + replyMarkup + ) + return data.photo ?.let { + data + } ?: MultipartRequestImpl( + data, + SendPhotoFiles(photo as MultipartFile) + ) +} + +@Serializable +data class SendPhotoData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(photoField) + @Optional + val photo: String? = null, + @SerialName(captionField) + @Optional + override val text: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : Data, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest +{ + override fun method(): String = "sendPhoto" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendPhotoFiles internal constructor( + val photo: MultipartFile +) : Files by mapOf( + photoField to photo +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendStickerByFileId.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendStickerByFileId.kt new file mode 100644 index 0000000000..3ad1b96fc5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendStickerByFileId.kt @@ -0,0 +1,62 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.ReplyingMarkupSendMessageRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls +import kotlinx.serialization.* +import kotlinx.serialization.json.JsonObject + +fun SendSticker( + chatId: ChatIdentifier, + sticker: InputFile, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request = SendStickerByFileId( + chatId, + sticker as? FileId, + disableNotification, + replyToMessageId, + replyMarkup +).let { + when (sticker) { + is MultipartFile -> SendStickerByFile(it, sticker) + is FileId -> it + } +} + +@Serializable +data class SendStickerByFileId internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(stickerField) + @Optional + val sticker: FileId? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : SendMessageRequest, ReplyingMarkupSendMessageRequest { + override fun method(): String = "sendSticker" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendStickerByFile internal constructor( + @Transient + private val sendStickerByFileId: SendStickerByFileId, + val sticker: MultipartFile +) : MultipartRequest, Request by sendStickerByFileId { + override val mediaMap: Map = mapOf(stickerField to sticker) + override val paramsJson: JsonObject = sendStickerByFileId.toJsonWithoutNulls(SendStickerByFileId.serializer()) +} + + diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideo.kt new file mode 100644 index 0000000000..bb47ea2b2c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideo.kt @@ -0,0 +1,114 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull +import kotlinx.serialization.* + +fun SendVideo( + chatId: ChatIdentifier, + video: InputFile, + thumb: InputFile?, + caption: String? = null, + parseMode: ParseMode? = null, + duration: Int? = null, + width: Int? = null, + height: Int? = null, + supportStreaming: Boolean? = null, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request { + val videoAsFileId = (video as? FileId) ?.fileId + val videoAsFile = video as? MultipartFile + val thumbAsFileId = (thumb as? FileId) ?.fileId + val thumbAsFile = thumb as? MultipartFile + + val data = SendVideoData( + chatId, + videoAsFileId, + thumbAsFileId, + caption, + parseMode, + duration, + width, + height, + supportStreaming, + disableNotification, + replyToMessageId, + replyMarkup + ) + + return if (videoAsFile == null && thumbAsFile == null) { + data + } else { + MultipartRequestImpl( + data, + SendVideoFiles(videoAsFile, thumbAsFile) + ) + } +} + +@Serializable +data class SendVideoData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(videoField) + @Optional + val video: String? = null, + @SerialName(thumbField) + @Optional + override val thumb: String? = null, + @SerialName(captionField) + @Optional + override val text: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(durationField) + @Optional + override val duration: Int? = null, + @SerialName(widthField) + @Optional + override val width: Int? = null, + @SerialName(heightField) + @Optional + override val height: Int? = null, + @SerialName(supportStreamingField) + @Optional + val supportStreaming: Boolean? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : Data, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest, + SizedSendMessageRequest +{ + + override fun method(): String = "sendVideo" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendVideoFiles internal constructor( + val video: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + videoField to video, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideoNote.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideoNote.kt new file mode 100644 index 0000000000..33c423f3c6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVideoNote.kt @@ -0,0 +1,108 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull +import kotlinx.serialization.* + +fun SendVideoNote( + chatId: ChatIdentifier, + videoNote: InputFile, + thumb: InputFile?, + caption: String? = null, + parseMode: ParseMode? = null, + duration: Int? = null, + size: Int? = null, // in documentation - length (size of video side) + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request { + val videoNoteAsFileId = (videoNote as? FileId) ?.fileId + val videoNoteAsFile = videoNote as? MultipartFile + val thumbAsFileId = (thumb as? FileId) ?.fileId + val thumbAsFile = thumb as? MultipartFile + + val data = SendVideoNoteData( + chatId, + videoNoteAsFileId, + thumbAsFileId, + caption, + parseMode, + duration, + size, + disableNotification, + replyToMessageId, + replyMarkup + ) + + return if (videoNoteAsFile == null && thumbAsFile == null) { + data + } else { + MultipartRequestImpl( + data, + SendVideoNoteFiles(videoNoteAsFile, thumbAsFile) + ) + } +} + +@Serializable +data class SendVideoNoteData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(videoNoteField) + @Optional + val videoNote: String? = null, + @SerialName(thumbField) + @Optional + override val thumb: String? = null, + @SerialName(captionField) + @Optional + override val text: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(durationField) + @Optional + override val duration: Int? = null, + @SerialName(lengthField) + @Optional + override val width: Int? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : Data, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest, + SizedSendMessageRequest +{ + @Transient + override val height: Int? + get() = width + + + override fun method(): String = "sendVideoNote" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendVideoNoteFiles internal constructor( + val videoNote: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + videoNoteField to videoNote, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVoice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVoice.kt new file mode 100644 index 0000000000..e859a0dbc3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/SendVoice.kt @@ -0,0 +1,98 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.KeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base.* +import com.github.insanusmokrassar.TelegramBotAPI.utils.mapOfNotNull +import kotlinx.serialization.* + +fun SendVoice( + chatId: ChatIdentifier, + voice: InputFile, + thumb: InputFile?, + caption: String? = null, + parseMode: ParseMode? = null, + duration: Int? = null, + disableNotification: Boolean = false, + replyToMessageId: MessageIdentifier? = null, + replyMarkup: KeyboardMarkup? = null +): Request { + val voiceAsFileId = (voice as? FileId) ?.fileId + val voiceAsFile = voice as? MultipartFile + val thumbAsFileId = (thumb as? FileId) ?.fileId + val thumbAsFile = thumb as? MultipartFile + + val data = SendVoiceData( + chatId, + voiceAsFileId, + thumbAsFileId, + caption, + parseMode, + duration, + disableNotification, + replyToMessageId, + replyMarkup + ) + + return if (voiceAsFile == null && thumbAsFile == null) { + data + } else { + MultipartRequestImpl( + data, + SendVoiceFiles(voiceAsFile, thumbAsFile) + ) + } +} + +@Serializable +data class SendVoiceData internal constructor( + @SerialName(chatIdField) + override val chatId: ChatIdentifier, + @SerialName(voiceField) + @Optional + val voice: String? = null, + @SerialName(thumbField) + @Optional + override val thumb: String? = null, + @SerialName(captionField) + @Optional + override val text: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @SerialName(durationField) + @Optional + override val duration: Int? = null, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: KeyboardMarkup? = null +) : Data, + SendMessageRequest, + ReplyingMarkupSendMessageRequest, + TextableSendMessageRequest, + ThumbedSendMessageRequest, + DuratedSendMessageRequest +{ + + override fun method(): String = "sendVoice" + override fun resultSerializer(): KSerializer = RawMessage.serializer() +} + +data class SendVoiceFiles internal constructor( + val voice: MultipartFile? = null, + val thumb: MultipartFile? = null +) : Files by mapOfNotNull( + voiceField to voice, + thumbField to thumb +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Data.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Data.kt new file mode 100644 index 0000000000..e2bd40e3d6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Data.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest + +interface Data : SimpleRequest \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Files.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Files.kt new file mode 100644 index 0000000000..e94cf03d33 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/Files.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile + +typealias Files = Map diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/MultipartRequestImpl.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/MultipartRequestImpl.kt new file mode 100644 index 0000000000..bcb68d8306 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/media/base/MultipartRequestImpl.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.media.base + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartRequest +import kotlinx.serialization.ImplicitReflectionSerializer +import kotlinx.serialization.KSerializer +import kotlinx.serialization.json.JsonObject + +/** + * Will be used as SimpleRequest if + */ +class MultipartRequestImpl, F: Files, R: Any>( + val data: D, + val files: F +) : MultipartRequest { + override fun method(): String = data.method() + override fun resultSerializer(): KSerializer = data.resultSerializer() + @ImplicitReflectionSerializer + override val paramsJson: JsonObject = data.json() + override val mediaMap: Map = files +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/payments/SendInvoice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/payments/SendInvoice.kt new file mode 100644 index 0000000000..4c7d4b6c9d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/send/payments/SendInvoice.kt @@ -0,0 +1,113 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.send.payments + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.send.abstracts.SendMessageRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.LabeledPrice +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.LabeledPricesSerializer +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.* +import kotlinx.serialization.* +import kotlinx.serialization.Optional +import java.util.* + +/** + * @param providerData - JSON-ENCODED FIELD + */ +@Serializable +data class SendInvoice( + @SerialName(chatIdField) + override val chatId: ChatId, + @SerialName(titleField) + val title: String, + @SerialName(descriptionField) + val description: String, + @SerialName(payloadField) + val payload: String, + @SerialName(providerTokenField) + val providerToken: String, + @SerialName(startParameterField) + val startParameter: StartParameter, + @Serializable(CurrencySerializer::class) + @SerialName(currencyField) + override val currency: Currency, + @Serializable(LabeledPricesSerializer::class) + @SerialName(pricesField) + override val prices: List, + @SerialName(providerDataField) + @Optional + val providerData: String? = null, + @SerialName(requireNameField) + @Optional + val requireName: Boolean = false, + @SerialName(requirePhoneNumberField) + @Optional + val requirePhoneNumber: Boolean = false, + @SerialName(requireEmailField) + @Optional + val requireEmail: Boolean = false, + @SerialName(requireShippingAddressField) + @Optional + val requireShippingAddress: Boolean = false, + @SerialName(shouldSendPhoneNumberToProviderField) + @Optional + val shouldSendPhoneNumberToProvider: Boolean = false, + @SerialName(shouldSendEmailToProviderField) + @Optional + val shouldSendEmailToProvider: Boolean = false, + @SerialName(priceDependOnShipAddressField) + @Optional + val priceDependOnShipAddress: Boolean = false, + @SerialName(disableNotificationField) + @Optional + override val disableNotification: Boolean = false, + @SerialName(replyToMessageIdField) + @Optional + override val replyToMessageId: MessageIdentifier? = null, + @SerialName(replyMarkupField) + @Optional + override val replyMarkup: InlineKeyboardMarkup? = null +) : Currencied, + Priced, + ChatRequest, + DisableNotification, + ReplyMessageId, + ReplyMarkup, + SendMessageRequest { + override fun method(): String = "sendInvoice" + override fun resultSerializer(): KSerializer = RawMessage.serializer() + + @SerialName(photoUrlField) + var photoUrl: String? = null + private set + @SerialName(photoSizeField) + var photoSize: Long? = null + private set + + @SerialName(photoWidthField) + var photoWidth: Int? = null + private set + @SerialName(photoHeightField) + var photoHeight: Int? = null + private set + + fun setPhoto( + photoUrl: String, + photoSize: Long? = null, + photoWidth: Int? = null, + photoHeight: Int? = null + ) { + this.photoUrl = photoUrl + this.photoSize = photoSize + this.photoWidth = photoWidth + this.photoHeight = photoHeight + } + + fun unsetPhoto() { + photoUrl = null + photoSize = null + photoWidth = null + photoHeight = null + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/AddStickerToSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/AddStickerToSet.kt new file mode 100644 index 0000000000..164d42d9ca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/AddStickerToSet.kt @@ -0,0 +1,49 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.common.CommonMultipartFileRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.stickers.abstracts.StickerSetAction +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.* + +fun AddStickerToSet( + userId: UserId, + stickerSetName: String, + sticker: InputFile, + emojis: String, + maskPosition: MaskPosition? = null +): Request { + val data = AddStickerToSet(userId, stickerSetName, emojis, sticker as? FileId, maskPosition) + return when (sticker) { + is MultipartFile -> CommonMultipartFileRequest( + data, + mapOf(pngStickerField to sticker) + ) + is FileId -> data + } +} + +@Serializable +data class AddStickerToSet internal constructor( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(nameField) + override val name: String, + @SerialName(emojisField) + override val emojis: String, + @SerialName(pngStickerField) + @Optional + val sticker: FileId? = null, + @SerialName(maskPositionField) + @Optional + override val maskPosition: MaskPosition? = null +) : StickerSetAction { + init { + if(emojis.isEmpty()) { + throw IllegalArgumentException("Emojis must not be empty") + } + } + + override fun method(): String = "addStickerToSet" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/CreateNewStickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/CreateNewStickerSet.kt new file mode 100644 index 0000000000..feb74bcfdd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/CreateNewStickerSet.kt @@ -0,0 +1,53 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.common.CommonMultipartFileRequest +import com.github.insanusmokrassar.TelegramBotAPI.requests.stickers.abstracts.StickerSetAction +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.* + +fun CreateNewStickerSet( + userId: UserId, + name: String, + sticker: InputFile, + emojis: String, + containsMasks: Boolean? = null, + maskPosition: MaskPosition? = null +): Request { + val data = CreateNewStickerSet(userId, name, emojis, sticker as? FileId, containsMasks, maskPosition) + return when (sticker) { + is MultipartFile -> CommonMultipartFileRequest( + data, + mapOf(pngStickerField to sticker) + ) + is FileId -> data + } +} + +@Serializable +data class CreateNewStickerSet internal constructor( + @SerialName(userIdField) + override val userId: UserId, + @SerialName(nameField) + override val name: String, + @SerialName(emojisField) + override val emojis: String, + @SerialName(pngStickerField) + @Optional + val sticker: FileId? = null, + @SerialName(containsMasksField) + @Optional + val containsMasks: Boolean? = null, + @SerialName(maskPositionField) + @Optional + override val maskPosition: MaskPosition? = null +) : StickerSetAction { + init { + if(emojis.isEmpty()) { + throw IllegalArgumentException("Emojis must not be empty") + } + } + + override fun method(): String = "createNewStickerSet" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/DeleteStickerFromSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/DeleteStickerFromSet.kt new file mode 100644 index 0000000000..4075829a75 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/DeleteStickerFromSet.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class DeleteStickerFromSet( + @SerialName(stickerField) + val sticker: FileId +) : SimpleRequest { + override fun method(): String = "deleteStickerFromSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/SetStickerPositionInSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/SetStickerPositionInSet.kt new file mode 100644 index 0000000000..930021f27f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/SetStickerPositionInSet.kt @@ -0,0 +1,24 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* +import kotlinx.serialization.internal.BooleanSerializer + +@Serializable +data class SetStickerPositionInSet( + @SerialName(stickerField) + val sticker: FileId, + @SerialName(positionField) + val position: Int +) : SimpleRequest { + init { + if (position < 0) { + throw IllegalArgumentException("Position must be positive or 0") + } + } + + override fun method(): String = "setStickerPositionInSet" + override fun resultSerializer(): KSerializer = BooleanSerializer +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/UploadStickerFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/UploadStickerFile.kt new file mode 100644 index 0000000000..8267d8f809 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/UploadStickerFile.kt @@ -0,0 +1,28 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartFile +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.MultipartRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.File +import com.github.insanusmokrassar.TelegramBotAPI.utils.toJsonWithoutNulls +import kotlinx.serialization.* +import kotlinx.serialization.json.JsonObject + +@Serializable +data class UploadStickerFile( + @SerialName(userIdField) + val userId: UserId, + @Transient + val sticker: MultipartFile = throw IllegalStateException("Detected autocreating try: this class can't be deserialized") +): MultipartRequest { + init { + // TODO:: add check of width/height of image and type of file - it must be png with max side length is 512px + } + + override fun method(): String = "uploadStickerFile" + @Transient + override val mediaMap: Map = mapOf(pngStickerField to sticker) + @Transient + override val paramsJson: JsonObject = toJsonWithoutNulls(serializer()) + override fun resultSerializer(): KSerializer = File.serializer() +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/abstracts/StickerSetAction.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/abstracts/StickerSetAction.kt new file mode 100644 index 0000000000..d53110b07e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/requests/stickers/abstracts/StickerSetAction.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.requests.stickers.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.SimpleRequest +import com.github.insanusmokrassar.TelegramBotAPI.types.UserId +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.KSerializer +import kotlinx.serialization.internal.BooleanSerializer + +interface StickerSetAction : SimpleRequest { + val userId: UserId + val name: String + val emojis: String // must be more than one + val maskPosition: MaskPosition? + + override fun resultSerializer(): KSerializer = BooleanSerializer +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/CallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/CallbackQuery.kt new file mode 100644 index 0000000000..a46fba7a1d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/CallbackQuery.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +interface CallbackQuery { + val id: CallbackQueryIdentifier + val user: User + val chatInstance: String +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/DataCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/DataCallbackQuery.kt new file mode 100644 index 0000000000..8f85fb2ff9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/DataCallbackQuery.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +interface DataCallbackQuery : CallbackQuery { + val data: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/GameShortNameCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/GameShortNameCallbackQuery.kt new file mode 100644 index 0000000000..644ac332b2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/GameShortNameCallbackQuery.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +interface GameShortNameCallbackQuery : CallbackQuery { + val gameShortName: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdCallbackQuery.kt new file mode 100644 index 0000000000..b2d7acf5b2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdCallbackQuery.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineMessageIdentifier + +interface InlineMessageIdCallbackQuery : CallbackQuery { + val inlineMessageId: InlineMessageIdentifier +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdDataCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdDataCallbackQuery.kt new file mode 100644 index 0000000000..3af1d0d875 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdDataCallbackQuery.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +data class InlineMessageIdDataCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val inlineMessageId: InlineMessageIdentifier, + override val data: String +) : DataCallbackQuery, InlineMessageIdCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdGameShortNameCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdGameShortNameCallbackQuery.kt new file mode 100644 index 0000000000..b2572bc55a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/InlineMessageIdGameShortNameCallbackQuery.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +data class InlineMessageIdGameShortNameCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val inlineMessageId: InlineMessageIdentifier, + override val gameShortName: String +) : GameShortNameCallbackQuery, InlineMessageIdCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageCallbackQuery.kt new file mode 100644 index 0000000000..c5e7dba7a2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageCallbackQuery.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +interface MessageCallbackQuery : CallbackQuery { + val message: Message +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageDataCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageDataCallbackQuery.kt new file mode 100644 index 0000000000..40130dc649 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageDataCallbackQuery.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +data class MessageDataCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val message: Message, + override val data: String +) : DataCallbackQuery, MessageCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageGameShortNameCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageGameShortNameCallbackQuery.kt new file mode 100644 index 0000000000..dd304d7ef9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/MessageGameShortNameCallbackQuery.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +data class MessageGameShortNameCallbackQuery( + override val id: CallbackQueryIdentifier, + override val user: User, + override val chatInstance: String, + override val message: Message, + override val gameShortName: String +) : GameShortNameCallbackQuery, MessageCallbackQuery diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/RawCallbackQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/RawCallbackQuery.kt new file mode 100644 index 0000000000..611ec6a730 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/CallbackQuery/RawCallbackQuery.kt @@ -0,0 +1,36 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import kotlinx.serialization.* + +@Serializable +data class RawCallbackQuery( + @SerialName(idField) + val id: CallbackQueryIdentifier, + @SerialName(fromField) + val from: User, + @Optional + val message: RawMessage? = null, + @SerialName(inlineMessageIdField) + @Optional + val inlineMessageId: InlineMessageIdentifier? = null, + @SerialName("chat_instance") + val chatInstance: String, + @Optional + val data: String? = null, + @SerialName("game_short_name") + @Optional + val gameShortName: String? = null +) { + @Transient + val asCallbackQuery: CallbackQuery by lazy { + when { + message != null && data != null -> MessageDataCallbackQuery(id, from, chatInstance, message.asMessage, data) + message != null && gameShortName != null -> MessageGameShortNameCallbackQuery(id, from, chatInstance, message.asMessage, gameShortName) + inlineMessageId != null && data != null -> InlineMessageIdDataCallbackQuery(id, from, chatInstance, inlineMessageId, data) + inlineMessageId != null && gameShortName != null -> InlineMessageIdGameShortNameCallbackQuery(id, from, chatInstance, inlineMessageId, gameShortName) + else -> throw IllegalStateException("Strange answer from server, can't create callback query") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt new file mode 100644 index 0000000000..79b353f25d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatIdentifier.kt @@ -0,0 +1,48 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* + +@Serializable(ChatIdentifierSerializer::class) +sealed class ChatIdentifier + +/** + * Also used as User Identifier + */ +@Serializable(ChatIdentifierSerializer::class) +class ChatId( + val chatId: Identifier +) : ChatIdentifier() + +typealias UserId = ChatId + +fun Identifier.toChatId(): ChatId = ChatId(this) + +@Serializable(ChatIdentifierSerializer::class) +class Username( + val username: String +) : ChatIdentifier() { + init { + if (!username.startsWith("@")) { + throw IllegalArgumentException("Username must starts with `@`") + } + } +} + +fun String.asUsername(): Username = Username(this) + +@Serializer(ChatIdentifier::class) +internal class ChatIdentifierSerializer: KSerializer { + override fun deserialize(input: Decoder): ChatIdentifier { + val id = input.decodeString() + return id.toLongOrNull() ?.let { + ChatId(it) + } ?: Username(id) + } + + override fun serialize(output: Encoder, obj: ChatIdentifier) { + when (obj) { + is ChatId -> output.encodeString(obj.chatId.toString()) + is Username -> output.encodeString(obj.username) + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/AdministratorChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/AdministratorChatMember.kt new file mode 100644 index 0000000000..f9dd24f588 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/AdministratorChatMember.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class AdministratorChatMember( + override val user: User, + val canBeEdited: Boolean, + val canChangeInfo: Boolean, + val canPostMessages: Boolean, + val canEditMessages: Boolean, + val canRemoveMessages: Boolean, + val canInviteUsers: Boolean, + val canRestrictMembers: Boolean, + val canPinMessages: Boolean, + val canPromoteMembers: Boolean +) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/BannedChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/BannedChatMember.kt new file mode 100644 index 0000000000..31ef2097bc --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/BannedChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.types.UntilDate + +interface BannedChatMember : ChatMember, UntilDate \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/ChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/ChatMember.kt new file mode 100644 index 0000000000..86f70d1bb3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/ChatMember.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +interface ChatMember { + val user: User +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/CreatorChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/CreatorChatMember.kt new file mode 100644 index 0000000000..1999680d49 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/CreatorChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class CreatorChatMember(override val user: User) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/KickedChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/KickedChatMember.kt new file mode 100644 index 0000000000..b97c314669 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/KickedChatMember.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.TelegramDate +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import org.joda.time.DateTime + +data class KickedChatMember( + override val user: User, + override val untilDate: TelegramDate? +) : BannedChatMember \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/LeftChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/LeftChatMember.kt new file mode 100644 index 0000000000..0fbcd3b4b7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/LeftChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class LeftChatMember(override val user: User) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/MemberChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/MemberChatMember.kt new file mode 100644 index 0000000000..b6ce19920c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/MemberChatMember.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class MemberChatMember(override val user: User) : ChatMember diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RawChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RawChatMember.kt new file mode 100644 index 0000000000..f216b1fbe0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RawChatMember.kt @@ -0,0 +1,85 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class RawChatMember( + val user: User, + private val status: String, + @Optional + private val until_date: TelegramDate? = null, + @SerialName(canBeEditedField) + @Optional + private val canBeEdited: Boolean = false, + @SerialName(canChangeInfoField) + @Optional + private val canChangeInfo: Boolean = false, + @SerialName(canPostMessagesField) + @Optional + private val canPostMessages: Boolean = false, + @SerialName(canEditMessagesField) + @Optional + private val canEditMessages: Boolean = false, + @SerialName(canDeleteMessagesField) + @Optional + private val canDeleteMessages: Boolean = false, + @SerialName(canInviteUsersField) + @Optional + private val canInviteUsers: Boolean = false, + @SerialName(canRestrictMembersField) + @Optional + private val canRestrictMembers: Boolean = false, + @SerialName(canPinMessagesField) + @Optional + private val canPinMessages: Boolean = false, + @SerialName(canPromoteMembersField) + @Optional + private val canPromoteMembers: Boolean = false, + @SerialName(canSendMessagesField) + @Optional + private val canSendMessages: Boolean = false, + @SerialName(canSendMediaMessagesField) + @Optional + private val canSendMediaMessages: Boolean = false, + @SerialName(canSendOtherMessagesField) + @Optional + private val canSendOtherMessages: Boolean = false, + @SerialName(canAddWebPagePreviewsField) + @Optional + private val canAddWebPagePreviews: Boolean = false +) { + @Transient + val asChatMember: ChatMember by lazy { + when (status) { + "creator" -> CreatorChatMember(user) + "administrator" -> AdministratorChatMember( + user, + canBeEdited, + canChangeInfo, + canPostMessages, + canEditMessages, + canDeleteMessages, + canInviteUsers, + canRestrictMembers, + canPinMessages, + canPromoteMembers + ) + "member" -> MemberChatMember(user) + "restricted" -> RestrictedChatMember( + user, + until_date, + canSendMessages, + canSendMediaMessages, + canSendOtherMessages, + canAddWebPagePreviews + ) + "left" -> LeftChatMember(user) + "kicked" -> KickedChatMember( + user, + until_date + ) + else -> throw IllegalStateException("Can't understand type of user: $status") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RestrictedChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RestrictedChatMember.kt new file mode 100644 index 0000000000..0e19d60752 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatMember/RestrictedChatMember.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ChatMember + +import com.github.insanusmokrassar.TelegramBotAPI.types.TelegramDate +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import org.joda.time.DateTime + +data class RestrictedChatMember( + override val user: User, + override val untilDate: TelegramDate?, + val canSendMessages: Boolean, + val canSendMediaMessages: Boolean, + val canSendOtherMessages: Boolean, + val canAddWebpagePreviews: Boolean +) : BannedChatMember \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatPhoto.kt new file mode 100644 index 0000000000..ba6784430d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ChatPhoto.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ChatPhoto( + @SerialName("small_file_id") + val smallFileId: String, + @SerialName("big_file_id") + val bigFileId: String +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt new file mode 100644 index 0000000000..8e5431c570 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Common.kt @@ -0,0 +1,181 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +typealias Identifier = Long +typealias MessageIdentifier = Long +typealias InlineQueryIdentifier = String +typealias UpdateIdentifier = Long +typealias MediaGroupIdentifier = String +typealias ForwardSignature = String +typealias AuthorSignature = ForwardSignature +typealias CallbackQueryIdentifier = String +typealias PaymentQueryIdentifier = String +typealias PreCheckoutQueryId = String +typealias ShippingQueryIdentifier = String +typealias InvoicePayload = String +typealias ShippingOptionIdentifier = String +typealias StartParameter = String +typealias InlineMessageIdentifier = String + +val callbackQueryAnswerLength = 0 .. 200 +val captionLength = 0 .. 1024 +val textLength = 0 .. 4096 +val userProfilePhotosRequestLimit = 0 .. 100 +val chatTitleLength = 1 .. 255 +val chatDescriptionLength = 0 .. 255 +val inlineResultQueryIdLingth = 1 .. 64 + +val invoiceTitleLimit = 1 .. 32 +val invoiceDescriptionLimit = 1 .. 255 +val invoicePayloadBytesLimit = 1 .. 128 + +const val chatIdField = "chat_id" +const val messageIdField = "message_id" +const val updateIdField = "update_id" +const val fromChatIdField = "from_chat_id" +const val disableWebPagePreviewField = "disable_web_page_preview" +const val disableNotificationField = "disable_notification" +const val replyToMessageIdField = "reply_to_message_id" +const val replyMarkupField = "reply_markup" +const val supportStreamingField = "support_streaming" +const val livePeriodField = "live_period" +const val isBotField = "is_bot" +const val firstNameField = "first_name" +const val lastNameField = "last_name" +const val languageCodeField = "language_code" +const val textEntitiesField = "text_entities" +const val stickerSetNameField = "set_name" +const val maskPositionField = "mask_position" +const val phoneNumberField = "phone_number" +const val userIdField = "user_id" +const val containsMasksField = "contains_masks" +const val resultIdField = "result_id" +const val inlineMessageIdField = "inline_message_id" +const val callbackDataField = "callback_data" +const val callbackQueryIdField = "callback_query_id" +const val showAlertField = "show_alert" +const val cachedTimeField = "cached_time" +const val foursquareIdField = "foursquare_id" +const val foursquareTypeField = "foursquare_type" +const val untilDateField = "until_date" +const val errorMessageField = "error_message" + +const val photoUrlField = "photo_url" +const val photoSizeField = "photo_size" +const val photoFileIdField = "photo_file_id" +const val gifUrlField = "gif_url" +const val gifFileIdField = "gif_file_id" +const val thumbUrlField = "thumb_url" +const val thumbWidthField = "thumb_width" +const val thumbHeightField = "thumb_height" +const val photoWidthField = "photo_width" +const val photoHeightField = "photo_height" +const val gifWidthField = "gif_width" +const val gifHeightField = "gif_height" +const val gifDurationField = "gif_duration" +const val inputMessageContentField = "input_message_content" +const val hideUrlField = "hide_url" +const val gameShortNameField = "game_short_name" + +const val canSendMessagesField = "can_send_messages" +const val canSendMediaMessagesField = "can_send_media_messages" +const val canSendOtherMessagesField = "can_send_other_messages" +const val canAddWebPagePreviewsField = "can_add_web_page_previews" + +const val canBeEditedField = "can_be_edited" +const val canChangeInfoField = "can_change_info" +const val canPostMessagesField = "can_post_messages" +const val canEditMessagesField = "can_edit_messages" +const val canDeleteMessagesField = "can_delete_messages" +const val canInviteUsersField = "can_invite_users" +const val canRestrictMembersField = "can_restrict_members" +const val canPinMessagesField = "can_pin_messages" +const val canPromoteMembersField = "can_promote_members" +const val pngStickerField = "png_sticker" + +const val okField = "ok" +const val captionField = "caption" +const val idField = "id" +const val textField = "text" +const val thumbField = "thumb" +const val emojiField = "emoji" +const val emojisField = "emojis" +const val titleField = "title" +const val descriptionField = "description" +const val performerField = "performer" +const val durationField = "duration" +const val widthField = "width" +const val heightField = "height" +const val lengthField = "length" +const val latitudeField = "latitude" +const val longitudeField = "longitude" +const val fromField = "from" +const val userField = "user" +const val dateField = "date" +const val chatField = "chat" +const val usernameField = "username" +const val nameField = "name" +const val emailField = "email" +const val locationField = "location" +const val queryField = "query" +const val offsetField = "offset" +const val limitField = "limit" +const val stickersField = "stickers" +const val stickerField = "sticker" +const val urlField = "url" +const val addressField = "address" +const val actionField = "action" +const val positionField = "position" +const val labelField = "label" +const val amountField = "amount" +const val pricesField = "prices" +const val payloadField = "payload" + +const val pointField = "point" +const val xShiftField = "x_shift" +const val yShiftField = "y_shift" +const val scaleField = "y_shift" + + +const val currencyField = "currency" +const val startParameterField = "start_parameter" +const val totalAmountField = "total_amount" +const val invoicePayloadField = "invoice_payload" +const val shippingOptionIdField = "shipping_option_id" +const val shippingQueryIdField = "shipping_query_id" +const val preCheckoutQueryIdField = "pre_checkout_query_id" +const val shippingOptionsField = "shipping_options" +const val countryCodeField = "country_code" +const val stateField = "state" +const val cityField = "city" +const val firstStreetLineField = "street_line1" +const val secondStreetLineField = "street_line2" +const val postCodeField = "post_code" +const val shippingAddressField = "shipping_address" +const val orderInfoField = "order_info" +const val telegramPaymentChargeIdField = "telegram_payment_charge_id" +const val providerPaymentChargeIdField = "provider_payment_charge_id" +const val providerTokenField = "provider_token" +const val providerDataField = "provider_data" + +const val requireNameField = "need_name" +const val requirePhoneNumberField = "need_phone_number" +const val requireEmailField = "need_email" +const val requireShippingAddressField = "need_shipping_address" + +const val shouldSendPhoneNumberToProviderField = "send_phone_number_to_provider" +const val shouldSendEmailToProviderField = "send_email_to_provider" + +const val priceDependOnShipAddressField = "is_flexible" + +const val documentField = "document" +const val photoField = "photo" +const val audioField = "audio" +const val videoField = "video" +const val animationField = "animation" +const val voiceField = "voice" +const val videoNoteField = "video_note" +const val mediaField = "media" + +const val disableEditMessageField = "disable_edit_message" +const val scoreField = "score" +const val forceField = "force" diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Contact.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Contact.kt new file mode 100644 index 0000000000..09b4ed72ea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Contact.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* + +@Serializable +data class Contact( + @SerialName(phoneNumberField) + val phoneNumber: String, + @SerialName(firstNameField) + val firstName: String, + @SerialName(lastNameField) + @Optional + val lastName: String? = null, + @SerialName(userIdField) + @Optional + val userId: UserId? = null, + @Optional + val vcard: String? = null +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/BaseChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/BaseChosenInlineResult.kt new file mode 100644 index 0000000000..df975d8d30 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/BaseChosenInlineResult.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult + +data class BaseChosenInlineResult( + override val resultId: InlineQueryIdentifier, + override val user: User, + override val inlineMessageId: InlineMessageIdentifier?, + override val query: String +) : ChosenInlineResult diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/LocationChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/LocationChosenInlineResult.kt new file mode 100644 index 0000000000..474643a5a2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/LocationChosenInlineResult.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult + +data class LocationChosenInlineResult( + override val resultId: InlineQueryIdentifier, + override val user: User, + val location: Location, + override val inlineMessageId: InlineMessageIdentifier?, + override val query: String +) : ChosenInlineResult diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/RawChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/RawChosenInlineResult.kt new file mode 100644 index 0000000000..5b54fd5ae7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/ChosenInlineResult/RawChosenInlineResult.kt @@ -0,0 +1,28 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult +import kotlinx.serialization.* + +@Serializable +data class RawChosenInlineResult( + @SerialName(resultIdField) + val resultId: InlineQueryIdentifier, //chosen temporary, can be changed + @SerialName(fromField) + val user: User, + @SerialName(queryField) + val query: String, + @SerialName(locationField) + @Optional + val location: Location? = null, + @SerialName(inlineMessageIdField) + @Optional + val inlineMessageId: InlineMessageIdentifier? = null +) { + @Transient + val asChosenInlineResult: ChosenInlineResult by lazy { + location ?.let { + LocationChosenInlineResult(resultId, user, location, inlineMessageId, query) + } ?: BaseChosenInlineResult(resultId, user, inlineMessageId, query) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultArticle.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultArticle.kt new file mode 100644 index 0000000000..9a298647a0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultArticle.kt @@ -0,0 +1,46 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InputMessageContent +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import kotlinx.serialization.Optional +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import kotlinx.serialization.Transient + +@Serializable +class InlineQueryResultArticle( + @SerialName(idField) + override val id: String, + @SerialName(titleField) + override val title: String, + @SerialName(inputMessageContentField) + override val inputMessageContent: InputMessageContent, + @SerialName(replyMarkupField) + override val replyMarkup: InlineKeyboardMarkup? = null, + @SerialName(urlField) + @Optional + val url: String? = null, + @SerialName(hideUrlField) + @Optional + val hideUrl: Boolean? = null, + @SerialName(descriptionField) + @Optional + override val description: String? = null, + @SerialName(thumbUrlField) + @Optional + override val thumbUrl: String? = null, + @SerialName(thumbWidthField) + @Optional + override val thumbWidth: Int? = null, + @SerialName(thumbHeightField) + @Optional + override val thumbHeight: Int? = null +) : InlineQueryResult, + ThumbSizedInlineQueryResult, + TitledInlineQueryResult, + DescribedInlineQueryResult, + WithInputMessageContentInlineQueryResult { + override val type: String = "article" +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultGame.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultGame.kt new file mode 100644 index 0000000000..2f45277614 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/InlineQueryResultGame.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts.InlineQueryResult +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.gameShortNameField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +class InlineQueryResultGame( + override val id: String, + @SerialName(gameShortNameField) + val gameShortName: String, + override val replyMarkup: InlineKeyboardMarkup? = null +) : InlineQueryResult { + override val type: String = "game" +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/CaptionedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/CaptionedInlineQueryResult.kt new file mode 100644 index 0000000000..0e00f81679 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/CaptionedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.abstracts.Captioned + +interface CaptionedInlineQueryResult : InlineQueryResult, Captioned diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DescribedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DescribedInlineQueryResult.kt new file mode 100644 index 0000000000..4e24811179 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DescribedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface DescribedInlineQueryResult : InlineQueryResult { + val description: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DuratedInlineResultQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DuratedInlineResultQuery.kt new file mode 100644 index 0000000000..a86254f568 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/DuratedInlineResultQuery.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface DuratedInlineResultQuery { + val duration: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/FileInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/FileInlineQueryResult.kt new file mode 100644 index 0000000000..ee381456d6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/FileInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId + +interface FileInlineQueryResult: InlineQueryResult { + val fileId: FileId +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/InlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/InlineQueryResult.kt new file mode 100644 index 0000000000..7e461c1f48 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/InlineQueryResult.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardMarkup +import com.github.insanusmokrassar.TelegramBotAPI.types.idField +import com.github.insanusmokrassar.TelegramBotAPI.types.replyMarkupField +import kotlinx.serialization.Optional +import kotlinx.serialization.SerialName + +interface InlineQueryResult { + val type: String + val id: String + val replyMarkup: InlineKeyboardMarkup? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/OptionallyTitledInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/OptionallyTitledInlineQueryResult.kt new file mode 100644 index 0000000000..cf20f42c64 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/OptionallyTitledInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface OptionallyTitledInlineQueryResult : InlineQueryResult { + val title: String? + + +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/PositionedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/PositionedInlineQueryResult.kt new file mode 100644 index 0000000000..b1b1748b66 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/PositionedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.abstracts.Locationed + +interface PositionedInlineQueryResult : InlineQueryResult, Locationed \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/SizedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/SizedInlineQueryResult.kt new file mode 100644 index 0000000000..7ea6dda6ea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/SizedInlineQueryResult.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface SizedInlineQueryResult : InlineQueryResult { + val width: Int? + val height: Int? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbSizedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbSizedInlineQueryResult.kt new file mode 100644 index 0000000000..45a1f7b766 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbSizedInlineQueryResult.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface ThumbSizedInlineQueryResult : InlineQueryResult, ThumbedInlineQueryResult { + val thumbWidth: Int? + val thumbHeight: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbedInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbedInlineQueryResult.kt new file mode 100644 index 0000000000..e5a1f58ca1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/ThumbedInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface ThumbedInlineQueryResult : InlineQueryResult { + val thumbUrl: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/TitledInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/TitledInlineQueryResult.kt new file mode 100644 index 0000000000..ff5781c058 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/TitledInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface TitledInlineQueryResult : OptionallyTitledInlineQueryResult { + override val title: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/UrlInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/UrlInlineQueryResult.kt new file mode 100644 index 0000000000..3c7ea70a62 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/UrlInlineQueryResult.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +interface UrlInlineQueryResult : InlineQueryResult { + val url: String +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithFileIdInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithFileIdInlineQueryResult.kt new file mode 100644 index 0000000000..b2b1cac02d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithFileIdInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId + +interface WithFileIdInlineQueryResult { + val fileId: FileId +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithInputMessageContentInlineQueryResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithInputMessageContentInlineQueryResult.kt new file mode 100644 index 0000000000..31ae77210c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/InlineQueryResult/abstracts/WithInputMessageContentInlineQueryResult.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.InlineQueryResult.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InputMessageContent + +interface WithInputMessageContentInlineQueryResult : InlineQueryResult { + val inputMessageContent: InputMessageContent +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/ChosenInlineResult.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/ChosenInlineResult.kt new file mode 100644 index 0000000000..88f4d3f570 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/ChosenInlineResult.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface ChosenInlineResult { + val resultId: InlineQueryIdentifier //chosen temporary, can be changed + val user: User + val inlineMessageId: InlineMessageIdentifier? + val query: String +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InlineQuery.kt new file mode 100644 index 0000000000..b602c21716 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InlineQuery.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +interface InlineQuery { + val id: InlineQueryIdentifier + val from: User + val query: String + val offset: Long + + fun answerQuery() +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InputMessageContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InputMessageContent.kt new file mode 100644 index 0000000000..fa2ec1f741 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/abstracts/InputMessageContent.kt @@ -0,0 +1,4 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts + +interface InputMessageContent { +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/BaseInlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/BaseInlineQuery.kt new file mode 100644 index 0000000000..fd95001d15 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/BaseInlineQuery.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueryIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +data class BaseInlineQuery( + override val id: InlineQueryIdentifier, + override val from: User, + override val query: String, + override val offset: Long +) : InlineQuery { + override fun answerQuery() { + TODO() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/LocationInlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/LocationInlineQuery.kt new file mode 100644 index 0000000000..7afa62f9c7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/LocationInlineQuery.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery + +data class LocationInlineQuery( + override val id: InlineQueryIdentifier, + override val from: User, + override val query: String, + override val offset: Long, + val location: Location +) : InlineQuery { + override fun answerQuery() { + TODO() + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/RawInlineQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/RawInlineQuery.kt new file mode 100644 index 0000000000..015a2f05b1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InlineQueries/query/RawInlineQuery.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class RawInlineQuery( + @SerialName(idField) + val id: InlineQueryIdentifier, + @SerialName(fromField) + val from: User, + @SerialName(queryField) + val query: String, + @SerialName(offsetField) + val offset: Long, + @SerialName(locationField) + @Optional + val location: Location? = null +) { + @Transient + val asInlineQuery by lazy { + location ?.let { + LocationInlineQuery(id, from, query, offset, location) + } ?: BaseInlineQuery(id, from, query, offset) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/CaptionedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/CaptionedInputMedia.kt new file mode 100644 index 0000000000..d1191a90bf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/CaptionedInputMedia.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode + +interface CaptionedInputMedia: InputMedia { + val caption: String? + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/DuratedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/DuratedInputMedia.kt new file mode 100644 index 0000000000..3ba3c0820a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/DuratedInputMedia.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +interface DuratedInputMedia : InputMedia { + val duration: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMedia.kt new file mode 100644 index 0000000000..03388e0ba5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMedia.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.InputFile + +const val inputMediaFileAttachmentNameTemplate = "attach://%s" + +interface InputMedia { + val type: String + val file: InputFile +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAnimation.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAnimation.kt new file mode 100644 index 0000000000..61c681e1e8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAnimation.kt @@ -0,0 +1,37 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaAnimation( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Optional + override val width: Int? = null, + @Optional + override val height: Int? = null, + @Optional + override val duration: Int? = null, + @Transient + override val thumb: InputFile? = null +) : InputMedia, SizedInputMedia, DuratedInputMedia, ThumbedInputMedia, CaptionedInputMedia { + override val type: String = "animation" + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAudio.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAudio.kt new file mode 100644 index 0000000000..f154442e62 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaAudio.kt @@ -0,0 +1,36 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaAudio( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Optional + override val duration: Int? = null, + @Optional + val performer: String? = null, + @Optional + override val title: String? = null, + override val thumb: InputFile? = null +) : InputMedia, DuratedInputMedia, ThumbedInputMedia, TitledInputMedia, CaptionedInputMedia { + override val type: String = "audio" + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaDocument.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaDocument.kt new file mode 100644 index 0000000000..4f6afce48d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaDocument.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaDocument( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Transient + override val thumb: InputFile? = null +) : InputMedia, ThumbedInputMedia, CaptionedInputMedia { + override val type: String = "document" + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaPhoto.kt new file mode 100644 index 0000000000..81225da074 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaPhoto.kt @@ -0,0 +1,44 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaPhoto( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null +) : InputMedia, CaptionedInputMedia, MediaGroupMemberInputMedia { + override val type: String = "photo" + + override fun serialize(format: StringFormat): String = format.stringify(serializer(), this) + + @Transient + override val arguments: Map = Mapper.mapNullable(serializer(), this) + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} + +fun PhotoSize.toInputMediaPhoto( + caption: String? = null, + parseMode: ParseMode? = null +): InputMediaPhoto = InputMediaPhoto( + fileId, + caption, + parseMode +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaVideo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaVideo.kt new file mode 100644 index 0000000000..f915c0b7b6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/InputMediaVideo.kt @@ -0,0 +1,42 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.parseModeField +import com.github.insanusmokrassar.TelegramBotAPI.types.mediaField +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import kotlinx.serialization.* + +@Serializable +data class InputMediaVideo( + @Transient + override val file: InputFile = throw IllegalStateException("Must be created with file"), + @Optional + override val caption: String? = null, + @SerialName(parseModeField) + @Optional + override val parseMode: ParseMode? = null, + @Optional + override val width: Int? = null, + @Optional + override val height: Int? = null, + @Optional + override val duration: Int? = null, + @Transient + override val thumb: InputFile? = null +) : InputMedia, SizedInputMedia, DuratedInputMedia, ThumbedInputMedia, CaptionedInputMedia, MediaGroupMemberInputMedia { + override val type: String = "video" + + override fun serialize(format: StringFormat): String = format.stringify(serializer(), this) + + @Transient + override val arguments: Map = Mapper.mapNullable(serializer(), this) + + @SerialName(mediaField) + val media: String + get() = file.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/MediaGroupMemberInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/MediaGroupMemberInputMedia.kt new file mode 100644 index 0000000000..ddaa944184 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/MediaGroupMemberInputMedia.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import kotlinx.serialization.StringFormat + +interface MediaGroupMemberInputMedia: InputMedia { + fun serialize(format: StringFormat): String + val arguments: Map +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/SizedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/SizedInputMedia.kt new file mode 100644 index 0000000000..010f8c4f72 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/SizedInputMedia.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +interface SizedInputMedia : InputMedia { + val width: Int? + val height: Int? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/ThumbedInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/ThumbedInputMedia.kt new file mode 100644 index 0000000000..69f24997c9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/ThumbedInputMedia.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.thumbField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +// TODO:: fill thumbed +interface ThumbedInputMedia : InputMedia { + val thumb: InputFile? + @Serializable + @SerialName(thumbField) + val thumbMedia: String? + get() = thumb ?.let { + when (it) { + is FileId -> it.fileId + is MultipartFile -> inputMediaFileAttachmentNameTemplate.format(it.fileId) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/TitledInputMedia.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/TitledInputMedia.kt new file mode 100644 index 0000000000..d6d58540a8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/InputMedia/TitledInputMedia.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.InputMedia + +interface TitledInputMedia : InputMedia { + val title: String? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Location.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Location.kt new file mode 100644 index 0000000000..3d313c268d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Location.kt @@ -0,0 +1,13 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.abstracts.Locationed +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class Location( + @SerialName(longitudeField) + override val longitude: Double, + @SerialName(latitudeField) + override val latitude: Double +) : Locationed diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt new file mode 100644 index 0000000000..91c92bb650 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BoldTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class BoldTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "*" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt new file mode 100644 index 0000000000..4556f722c0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/BotCommandMessageEntity.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class BotCommandMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + val command: String by lazy { + sourceString.substring(1)// skip first symbol like "/" or "!" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt new file mode 100644 index 0000000000..741a0a60d3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/CodeTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class CodeTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "`" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt new file mode 100644 index 0000000000..cdd17c79cb --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/EMailMessageEntity.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +class EMailMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + override val asMarkdownSource: String by lazy { + "[$sourceString](mailto://$sourceString)" + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt new file mode 100644 index 0000000000..1bc3c9a1ff --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/HashTagMessageEntity.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class HashTagMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt new file mode 100644 index 0000000000..32e4665b25 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/ItalicTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class ItalicTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "_" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt new file mode 100644 index 0000000000..59e2ae08db --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MentionMessageEntity.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +class MentionMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + override val asMarkdownSource: String + get() = sourceString +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt new file mode 100644 index 0000000000..5c181d7fbf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/MessageEntity.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +interface MessageEntity { + val offset: Int + val length: Int + val sourceString: String + + val asMarkdownSource: String + get() = sourceString +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt new file mode 100644 index 0000000000..6bccd2e78f --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PhoneNumberMessageEntity.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class PhoneNumberMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt new file mode 100644 index 0000000000..e9789d7ad0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/PreTextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class PreTextMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : TextMessageEntity() { + override val formatSymbol: String = "```" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RawMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RawMessageEntity.kt new file mode 100644 index 0000000000..e841ef3afe --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/RawMessageEntity.kt @@ -0,0 +1,42 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class RawMessageEntity( + val type: String, + val offset: Int, + val length: Int, + @Optional + val url: String? = null, + @Optional + val user: User? = null +) { + fun asMessageEntity(source: String): MessageEntity { + val sourceSubstring = source.substring(offset, offset + length) + return when (type) { + "mention" -> MentionMessageEntity(offset, length, sourceSubstring) + "hashtag" -> HashTagMessageEntity(offset, length, sourceSubstring) + "cashtag" -> TODO() + "bot_command" -> BotCommandMessageEntity(offset, length, sourceSubstring) + "url" -> URLMessageEntity(offset, length, sourceSubstring) + "email" -> EMailMessageEntity(offset, length, sourceSubstring) + "phone_number" -> PhoneNumberMessageEntity(offset, length, sourceSubstring) + "bold" -> BoldTextMessageEntity(offset, length, sourceSubstring) + "italic" -> ItalicTextMessageEntity(offset, length, sourceSubstring) + "code" -> CodeTextMessageEntity(offset, length, sourceSubstring) + "pre" -> PreTextMessageEntity(offset, length, sourceSubstring) + "text_link" -> TextLinkMessageEntity(offset, length, sourceSubstring, url ?: throw IllegalStateException("URL must not be null for text link")) + "text_mention" -> TextMentionMessageEntity(offset, length, sourceSubstring, user ?: throw IllegalStateException("User must not be null for text mention")) + else -> throw IllegalArgumentException("Unknown type of message entity") + } + } +} + +typealias RawMessageEntities = List + +object RawMessageEntitiesSerializer : KSerializer> by ArrayListSerializer( + RawMessageEntity.serializer() +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt new file mode 100644 index 0000000000..9d149100ca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextLinkMessageEntity.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class TextLinkMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String, + val url: String +) : MessageEntity { + override val asMarkdownSource: String by lazy { + "[$sourceString]($url)" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt new file mode 100644 index 0000000000..eba3c210d2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMentionMessageEntity.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +import com.github.insanusmokrassar.TelegramBotAPI.types.User + +class TextMentionMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String, + val user: User +) : MessageEntity { + override val asMarkdownSource: String by lazy { + "[$sourceString](tg://user?id=${user.id})" + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt new file mode 100644 index 0000000000..53c7142383 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/TextMessageEntity.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +abstract class TextMessageEntity : MessageEntity { + protected abstract val formatSymbol: String + + override val asMarkdownSource: String by lazy { + "$formatSymbol$sourceString$formatSymbol" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt new file mode 100644 index 0000000000..6a5a182318 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/MessageEntity/URLMessageEntity.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity + +data class URLMessageEntity( + override val offset: Int, + override val length: Int, + override val sourceString: String +) : MessageEntity { + val url: String + get() = sourceString + + override val asMarkdownSource: String by lazy { + "[$sourceString]($url)" + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt new file mode 100644 index 0000000000..23e5f3b108 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ParseMode/ParseMode.kt @@ -0,0 +1,41 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode + +import kotlinx.serialization.* +import java.lang.IllegalArgumentException + +internal const val parseModeField = "parse_mode" + +@Serializable(ParseModeSerializerObject::class) +sealed class ParseMode { + abstract val parseModeName: String +} + +@Serializable(ParseModeSerializerObject::class) +object MarkdownParseMode : ParseMode() { + @Serializable + @SerialName(parseModeField) + override val parseModeName: String = "Markdown" +} + +@Serializable(ParseModeSerializerObject::class) +object HTMLParseMode : ParseMode() { + @Serializable + @SerialName(parseModeField) + override val parseModeName: String = "HTML" +} + +@Serializer(ParseMode::class) +internal class ParseModeSerializerObject: KSerializer { + override fun deserialize(input: Decoder): ParseMode { + val mode = input.decodeString() + return when (mode) { + MarkdownParseMode.parseModeName -> MarkdownParseMode + HTMLParseMode.parseModeName -> HTMLParseMode + else -> throw IllegalArgumentException("Unknown parse mode") + } + } + + override fun serialize(output: Encoder, obj: ParseMode) { + output.encodeString(obj.parseModeName) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ResponseParameters.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ResponseParameters.kt new file mode 100644 index 0000000000..d038f3a323 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/ResponseParameters.kt @@ -0,0 +1,30 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* +import org.joda.time.DateTime +import java.util.concurrent.TimeUnit + +@Serializable +data class ResponseParameters( + val ok: Boolean = false, + @Optional + val description: String? = null, + @SerialName("migrate_to_chat_id") + @Optional + val migrateToChatId: Identifier? = null, + @SerialName("retry_after") + @Optional + val retryAfter: Int? = null, + @SerialName("error_code") + @Optional + val errorCode: Int? = null, + @Optional + val result: T? = null +) { + @Transient + val waitUntil: DateTime? by lazy { + retryAfter ?.let { + DateTime.now().plus(TimeUnit.SECONDS.toMillis(it.toLong())) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/TelegramDate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/TelegramDate.kt new file mode 100644 index 0000000000..5f6bb99c93 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/TelegramDate.kt @@ -0,0 +1,36 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* +import org.joda.time.DateTime +import java.util.concurrent.TimeUnit + +@Serializable(TelegramDateSerializer::class) +class TelegramDate( + private val date: Long +) { + constructor(dateTime: DateTime) : this( + TimeUnit.MILLISECONDS.toSeconds(dateTime.millis) + ) + + @Transient + val asDate: DateTime = DateTime( + TimeUnit.SECONDS.toMillis(date) + ) +} + +fun DateTime.toTelegramDate(): TelegramDate = TelegramDate(this) + +@Serializer(TelegramDate::class) +internal class TelegramDateSerializer: KSerializer { + override fun serialize(output: Encoder, obj: TelegramDate) { + output.encodeLong( + TimeUnit.MILLISECONDS.toSeconds(obj.asDate.millis) + ) + } + + override fun deserialize(input: Decoder): TelegramDate { + return TelegramDate( + input.decodeLong() + ) + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt new file mode 100644 index 0000000000..4e40b14e93 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/User.kt @@ -0,0 +1,31 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* +import kotlinx.serialization.Optional +import java.util.* + +@Serializable +data class User( + val id: ChatId, + @SerialName(isBotField) + @Optional + val isBot: Boolean = false, + @SerialName(firstNameField) + val firstName: String, + @SerialName(lastNameField) + @Optional + val lastName: String? = null, + @SerialName(usernameField) + @Optional + val username: String? = null, + @SerialName(languageCodeField) + @Optional + private val languageCode: String? = null +) { + @Transient + val userLocale: Locale? by lazy { + languageCode ?.let { + Locale.forLanguageTag(it) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/UserProfilePhotos.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/UserProfilePhotos.kt new file mode 100644 index 0000000000..f54cf75787 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/UserProfilePhotos.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.Photo +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSerializer +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class UserProfilePhotos ( + @SerialName("total_count") + val count: Int, + @Serializable(UserProfilePhotosPhotosSerializer::class) + val photos: List +) + +object UserProfilePhotosPhotosSerializer : KSerializer> by ArrayListSerializer( + PhotoSerializer +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Venue.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Venue.kt new file mode 100644 index 0000000000..f979d0131c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/Venue.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types + +import kotlinx.serialization.* + +@Serializable +data class Venue( + @SerialName(locationField) + val location: Location, + @SerialName(titleField) + val title: String, + @SerialName(addressField) + val address: String, + @SerialName(foursquareIdField) + @Optional + val foursquareId: String? = null, + @SerialName(foursquareTypeField) + @Optional + val foursquareType: String? = null // TODO:: Rewrite with enum or interface +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Captioned.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Captioned.kt new file mode 100644 index 0000000000..23bf23b54e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Captioned.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.ParseMode.ParseMode + +interface Captioned { + val caption: String? + val parseMode: ParseMode? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Locationed.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Locationed.kt new file mode 100644 index 0000000000..e8cbbfeba0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/abstracts/Locationed.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.abstracts + +interface Locationed { + val latitude: Double + val longitude: Double +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/actions/BotAction.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/actions/BotAction.kt new file mode 100644 index 0000000000..1b5ad39641 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/actions/BotAction.kt @@ -0,0 +1,75 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.actions + +import kotlinx.serialization.* + +private val actions = listOf( + TypingAction, + UploadPhotoAction, + RecordVideoAction, + UploadVideoAction, + RecordAudioAction, + UploadAudioAction, + UploadDocumentAction, + FindLocationAction +) + +@Serializable(BotActionSerializer::class) +sealed class BotAction { + abstract val actionName: String +} + +@Serializer(BotAction::class) +class BotActionSerializer: KSerializer { + override fun serialize(output: Encoder, obj: BotAction) { + output.encodeString(obj.actionName) + } + + override fun deserialize(input: Decoder): BotAction { + val actionName = input.decodeString() + return actions.firstOrNull { it.actionName == actionName } ?: throw IllegalStateException("Unknown action type: $actionName") + } +} + +/** + * Use BotAction objects realisations to notify user about bot actions + */ + +@Serializable(BotActionSerializer::class) +object TypingAction : BotAction() { + override val actionName: String = "typing" +} + +@Serializable(BotActionSerializer::class) +object UploadPhotoAction : BotAction() { + override val actionName: String = "upload_photo" +} + +@Serializable(BotActionSerializer::class) +object RecordVideoAction : BotAction() { + override val actionName: String = "record_video" +} + +@Serializable(BotActionSerializer::class) +object UploadVideoAction : BotAction() { + override val actionName: String = "upload_video" +} + +@Serializable(BotActionSerializer::class) +object RecordAudioAction : BotAction() { + override val actionName: String = "record_audio" +} + +@Serializable(BotActionSerializer::class) +object UploadAudioAction : BotAction() { + override val actionName: String = "upload_audio" +} + +@Serializable(BotActionSerializer::class) +object UploadDocumentAction : BotAction() { + override val actionName: String = "upload_document" +} + +@Serializable(BotActionSerializer::class) +object FindLocationAction : BotAction() { + override val actionName: String = "find_location" +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/Common.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/Common.kt new file mode 100644 index 0000000000..f01fc81609 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/Common.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +typealias Matrix = List> diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ForceReply.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ForceReply.kt new file mode 100644 index 0000000000..383d8d5084 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ForceReply.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class ForceReply( + @Optional + val selective: Boolean? = null +) : KeyboardMarkup { + @SerialName("force_reply") + val forceReply: Boolean = true +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton.kt new file mode 100644 index 0000000000..2610605f94 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/CallbackDataInlineKeyboardButton.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import com.github.insanusmokrassar.TelegramBotAPI.types.callbackDataField +import com.github.insanusmokrassar.TelegramBotAPI.types.textField +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class CallbackDataInlineKeyboardButton( + @SerialName(textField) + override val text: String, + @SerialName(callbackDataField) + val callbackData: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt new file mode 100644 index 0000000000..cf1bfc63b2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/InlineKeyboardButton.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +interface InlineKeyboardButton { + val text: String +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/PayInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/PayInlineKeyboardButton.kt new file mode 100644 index 0000000000..edc357b468 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/PayInlineKeyboardButton.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.Serializable + +//TODO:: add check that this button first in a row (it MUST be first in a row) +@Serializable +data class PayInlineKeyboardButton( + override val text: String, + val pay: Boolean +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryCurrentChatInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryCurrentChatInlineKeyboardButton.kt new file mode 100644 index 0000000000..731a3b4cca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryCurrentChatInlineKeyboardButton.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SwitchInlineQueryCurrentChatInlineKeyboardButton( + override val text: String, + @SerialName("switch_inline_query_currentChat") + val switchInlineQueryCurrentChat: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryInlineKeyboardButton.kt new file mode 100644 index 0000000000..a5134c6a8b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/SwitchInlineQueryInlineKeyboardButton.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class SwitchInlineQueryInlineKeyboardButton( + override val text: String, + @SerialName("switch_inline_query") + val switchInlineQuery: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/URLInlineKeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/URLInlineKeyboardButton.kt new file mode 100644 index 0000000000..5272e43f29 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardButtons/URLInlineKeyboardButton.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons + +import kotlinx.serialization.Serializable + +@Serializable +data class URLInlineKeyboardButton( + override val text: String, + val url: String +) : InlineKeyboardButton diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardMarkup.kt new file mode 100644 index 0000000000..7c5e9e590e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/InlineKeyboardMarkup.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.InlineKeyboardButtons.InlineKeyboardButton +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class InlineKeyboardMarkup( + @SerialName("inline_keyboard") + val keyboard: Matrix +) : KeyboardMarkup diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardButton.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardButton.kt new file mode 100644 index 0000000000..7e03499cc2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardButton.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class KeyboardButton( + val text: String, + @SerialName("request_contact") + @Optional + val requestContact: Boolean? = null, + @SerialName("request_location") + @Optional + val requestLocation: Boolean? = null +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardMarkup.kt new file mode 100644 index 0000000000..09629a51be --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/KeyboardMarkup.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +interface KeyboardMarkup diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardMarkup.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardMarkup.kt new file mode 100644 index 0000000000..938a1ad8dd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardMarkup.kt @@ -0,0 +1,16 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class ReplyKeyboardMarkup( + val keyboard: Matrix, + @SerialName("resize_keyboard") + @Optional + val resizeKeyboard: Boolean? = null, + @SerialName("one_time_keyboard") + @Optional + val oneTimeKeyboard: Boolean? = null, + @Optional + val selective: Boolean? = null +) : KeyboardMarkup diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardRemove.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardRemove.kt new file mode 100644 index 0000000000..a5421a7078 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/buttons/ReplyKeyboardRemove.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.buttons + +import kotlinx.serialization.* + +@Serializable +data class ReplyKeyboardRemove( + @Optional + val selective: Boolean? = null +) : KeyboardMarkup { + @SerialName("remove_keyboard") + val removeKeyboard: Boolean = true +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/ChannelChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/ChannelChat.kt new file mode 100644 index 0000000000..6db6fc6773 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/ChannelChat.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage + +data class ChannelChat( + override val id: ChatId, + override val title: String? = null, + val username: String? = null, + val description: String? = null, + override val inviteLink: String? = null, + override val chatPhoto: ChatPhoto? = null, + val pinnedMessage: RawMessage? +) : PublicChat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/Chat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/Chat.kt new file mode 100644 index 0000000000..59156434e6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/Chat.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface Chat { + val id: ChatId + val chatPhoto: ChatPhoto? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/GroupChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/GroupChat.kt new file mode 100644 index 0000000000..99f52fa4b0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/GroupChat.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +interface GroupChat : PublicChat { + val allMembersAreAdmins: Boolean +} + +data class GroupChatImpl( + override val id: ChatId, + override val title: String? = null, + override val allMembersAreAdmins: Boolean, + override val inviteLink: String? = null, + override val chatPhoto: ChatPhoto? = null) : GroupChat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PrivateChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PrivateChat.kt new file mode 100644 index 0000000000..ebaec2c0de --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PrivateChat.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* + +data class PrivateChat( + override val id: ChatId, + val username: String? = null, + val firstName: String? = null, + val lastName: String? = null, + override val chatPhoto: ChatPhoto? = null +) : Chat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PublicChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PublicChat.kt new file mode 100644 index 0000000000..27087007df --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/PublicChat.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +interface PublicChat : Chat { + val title: String? + val inviteLink: String? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/RawChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/RawChat.kt new file mode 100644 index 0000000000..7e8fb87c20 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/RawChat.kt @@ -0,0 +1,58 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import kotlinx.serialization.* + +@Serializable +data class RawChat( + override val id: ChatId, + private val type: String, + @Optional private val title: String? = null, + @Optional private val username: String? = null, + @Optional private val first_name: String? = null, + @Optional private val last_name: String? = null, + @Optional private val all_members_are_administrators: Boolean? = null, + @Optional private val description: String? = null, + @Optional private val invite_link: String? = null, + @Optional private val pinned_message: RawMessage? = null, + @Optional private val sticker_set_name: String? = null, + @Optional private val can_set_sticker_set: Boolean? = null, + @SerialName("photo") + @Optional override val chatPhoto: ChatPhoto? = null +) : Chat { + fun extractChat(): Chat { + return when (type) { + "private" -> PrivateChat(id, username, first_name, last_name, chatPhoto) + "group" -> GroupChatImpl( + id, + title, + all_members_are_administrators ?: false, + invite_link, + chatPhoto + ) + "supergroup" -> SupergroupChat( + id, + title, + username, + description, + all_members_are_administrators ?: false, + invite_link, + chatPhoto, + pinned_message, + sticker_set_name, + can_set_sticker_set ?: false + ) + "channel" -> ChannelChat( + id, + title, + username, + description, + invite_link, + chatPhoto, + pinned_message + ) + else -> throw IllegalArgumentException("Unknown type of chat") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/SupergroupChat.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/SupergroupChat.kt new file mode 100644 index 0000000000..bbb2fd42b6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/chat/SupergroupChat.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.chat + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage + +data class SupergroupChat( + override val id: ChatId, + override val title: String? = null, + val username: String? = null, + val description: String? = null, + override val allMembersAreAdmins: Boolean, + override val inviteLink: String? = null, + override val chatPhoto: ChatPhoto? = null, + val pinnedMessage: RawMessage? = null, + val stickerSetName: String? = null, + val canSetStickerSet: Boolean +) : GroupChat diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt new file mode 100644 index 0000000000..4bf40ef200 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AnimationFile.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class AnimationFile( + @SerialName(fileIdField) + override val fileId: FileId, + override val width: Int, + override val height: Int, + @Optional + override val duration: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(fileNameField) + @Optional + override val fileName: String? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, CustomNamedMediaFile, SizedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt new file mode 100644 index 0000000000..fa653f0539 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/AudioFile.kt @@ -0,0 +1,25 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class AudioFile( + @SerialName(fileIdField) + override val fileId: FileId, + @Optional + override val duration: Long? = null, + @Optional + val performer: String? = null, + @Optional + override val title: String? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + @Optional + override val thumb: PhotoSize? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, TitledMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt new file mode 100644 index 0000000000..07222aa2ed --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/DocumentFile.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class DocumentFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileNameField) + @Optional + override val fileName: String? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, CustomNamedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/File.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/File.kt new file mode 100644 index 0000000000..5cd37e45ff --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/File.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class File( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +): TelegramMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PathedFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PathedFile.kt new file mode 100644 index 0000000000..83c812f8ab --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PathedFile.kt @@ -0,0 +1,26 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class PathedFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(filePathField) + val filePath: String, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +): TelegramMediaFile + +fun PathedFile.makeFileUrl( + botToken: String, + apiHost: String = "https://api.telegram.org" +) = "${downloadingFilesBaseUrl(botToken, apiHost)}/$filePath" + +fun downloadingFilesBaseUrl( + botToken: String, + apiHost: String +) = "$apiHost/file/bot$botToken" diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PhotoSize.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PhotoSize.kt new file mode 100644 index 0000000000..bb16194cd0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/PhotoSize.kt @@ -0,0 +1,38 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +typealias Photo = List + +fun Photo.biggest(): PhotoSize? { + var biggest: PhotoSize = firstOrNull() ?: return null + forEach { + if (it.resolution > biggest.resolution) { + biggest = it + } + } + return biggest +} + +object PhotoSerializer : KSerializer by ArrayListSerializer( + PhotoSize.serializer() +) + +@Serializable +data class PhotoSize( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + override val width: Int, + override val height: Int +) : SizedMediaFile { + @Transient + val resolution: Long by lazy { + width.toLong() * height + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/Sticker.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/Sticker.kt new file mode 100644 index 0000000000..0b2b020545 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/Sticker.kt @@ -0,0 +1,32 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import com.github.insanusmokrassar.TelegramBotAPI.types.stickers.MaskPosition +import kotlinx.serialization.* + +@Serializable +data class Sticker( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(widthField) + override val width: Int, + @SerialName(heightField) + override val height: Int, + @SerialName(thumbField) + @Optional + override val thumb: PhotoSize? = null, + @SerialName(emojiField) + @Optional + val emoji: String? = null, + @SerialName(stickerSetNameField) + @Optional + val stickerSetName: String? = null, + @SerialName(maskPositionField) + @Optional + val maskPosition: MaskPosition? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, SizedMediaFile, ThumbedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/TelegramFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/TelegramFile.kt new file mode 100644 index 0000000000..adfbf76404 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/TelegramFile.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class TelegramFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null, + @SerialName("file_path") + @Optional + val filePath: String? = null +) : TelegramMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt new file mode 100644 index 0000000000..e68d1f7bd2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoFile.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class VideoFile( + @SerialName(fileIdField) + override val fileId: FileId, + override val width: Int, + override val height: Int, + @Optional + override val duration: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, MimedMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoNoteFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoNoteFile.kt new file mode 100644 index 0000000000..6e906e57be --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VideoNoteFile.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class VideoNoteFile( + @SerialName(fileIdField) + override val fileId: FileId, + @SerialName("length") + override val width: Int, + @Optional + override val duration: Long? = null, + @Optional + override val thumb: PhotoSize? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, ThumbedMediaFile, PlayableMediaFile, SizedMediaFile { + override val height: Int + get() = width +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt new file mode 100644 index 0000000000..bcc8bfb1e5 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/VoiceFile.kt @@ -0,0 +1,19 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId +import kotlinx.serialization.* + +@Serializable +data class VoiceFile( + @SerialName(fileIdField) + override val fileId: FileId, + @Optional + override val duration: Long? = null, + @SerialName(mimeTypeField) + @Optional + override val mimeType: String? = null, + @SerialName(fileSizeField) + @Optional + override val fileSize: Long? = null +) : TelegramMediaFile, MimedMediaFile, PlayableMediaFile diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/CustomNamedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/CustomNamedMediaFile.kt new file mode 100644 index 0000000000..b7e7745c6a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/CustomNamedMediaFile.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +internal const val fileNameField = "file_name" + +interface CustomNamedMediaFile { + val fileName: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/MimedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/MimedMediaFile.kt new file mode 100644 index 0000000000..2ab9ffcf0a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/MimedMediaFile.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +internal const val mimeTypeField = "mime_type" + +interface MimedMediaFile : TelegramMediaFile { + val mimeType: String? // TODO::replace by something like enum or interface +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/PlayableMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/PlayableMediaFile.kt new file mode 100644 index 0000000000..3755952a49 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/PlayableMediaFile.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +interface PlayableMediaFile : TelegramMediaFile { + val duration: Long? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/SizedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/SizedMediaFile.kt new file mode 100644 index 0000000000..1df6fe7a4e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/SizedMediaFile.kt @@ -0,0 +1,6 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +interface SizedMediaFile : TelegramMediaFile { + val width: Int + val height: Int +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TelegramMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TelegramMediaFile.kt new file mode 100644 index 0000000000..c4749caa59 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TelegramMediaFile.kt @@ -0,0 +1,15 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.FileId + +internal const val fileIdField = "file_id" +internal const val fileSizeField = "file_size" +internal const val filePathField = "file_path" + +/** + * Declare common part of media files in Telegram. Note: it is not representation of `File` type + */ +interface TelegramMediaFile { + val fileId: FileId + val fileSize: Long? +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/ThumbedMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/ThumbedMediaFile.kt new file mode 100644 index 0000000000..4c185377a7 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/ThumbedMediaFile.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize + +interface ThumbedMediaFile : TelegramMediaFile { + val thumb: PhotoSize? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TitledMediaFile.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TitledMediaFile.kt new file mode 100644 index 0000000000..2f63e0d6af --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/files/abstracts/TitledMediaFile.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts + +interface TitledMediaFile { + val title: String? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/CallbackGame.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/CallbackGame.kt new file mode 100644 index 0000000000..1d74fd18ff --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/CallbackGame.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.games + +import kotlinx.serialization.Serializable + +@Serializable +class CallbackGame { + init { + TODO() + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/Game.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/Game.kt new file mode 100644 index 0000000000..be6dd46cd4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/Game.kt @@ -0,0 +1,34 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.games + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.* +import kotlinx.serialization.* + +@Serializable +data class Game( + @SerialName(titleField) + val title: String, + @SerialName(descriptionField) + val description: String, + @Serializable(PhotoSerializer::class) + @SerialName(photoField) + val photo: Photo, + @SerialName(textField) + @Optional + val text: String? = null, + @Serializable(RawMessageEntitiesSerializer::class) + @SerialName(textEntitiesField) + @Optional + private val textEntitiesRaw: RawMessageEntities? = null, + @SerialName(animationField) + @Optional + val animation: AnimationFile? = null +) { + @Transient + val textEntities: List? = text ?.let { + textEntitiesRaw ?.map { + it.asMessageEntity(text) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/GameHighScore.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/GameHighScore.kt new file mode 100644 index 0000000000..c01188affd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/games/GameHighScore.kt @@ -0,0 +1,15 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.games + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class GameHighScore ( + @SerialName(positionField) + val position: Long, + @SerialName(userField) + val user: User, + @SerialName(scoreField) + val score: Long +) \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelEventMessage.kt new file mode 100644 index 0000000000..63fb4df00e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelEventMessage.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.ChannelChat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.ChannelEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ChatEventMessage +import org.joda.time.DateTime + +data class ChannelEventMessage( + override val messageId: MessageIdentifier, + override val chat: ChannelChat, + override val chatEvent: ChannelEvent, + override val date: DateTime +) : ChatEventMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelMessage.kt new file mode 100644 index 0000000000..781e81d0cd --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChannelMessage.kt @@ -0,0 +1,20 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.AuthorSignature +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.CommonMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent +import org.joda.time.DateTime + +data class ChannelMessage( + override val messageId: MessageIdentifier, + override val chat: Chat, + override val content: T, + override val date: DateTime, + override val editDate: DateTime?, + override val forwarded: ForwardedMessage?, + override val replyTo: Message?, + val authorSignature: AuthorSignature? +) : CommonMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/ChannelChatCreated.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/ChannelChatCreated.kt new file mode 100644 index 0000000000..bd07b39c8b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/ChannelChatCreated.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.ChannelEvent + +class ChannelChatCreated: ChannelEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/DeleteChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/DeleteChatPhoto.kt new file mode 100644 index 0000000000..c94bf5d8a9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/DeleteChatPhoto.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent + +class DeleteChatPhoto: CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/GroupChatCreated.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/GroupChatCreated.kt new file mode 100644 index 0000000000..bedeca44fe --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/GroupChatCreated.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent + +class GroupChatCreated( + val migratedTo: ChatIdentifier? +): GroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/LeftChatMember.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/LeftChatMember.kt new file mode 100644 index 0000000000..dcdaa133d3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/LeftChatMember.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent + +data class LeftChatMember( + val user: User +): GroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatMembers.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatMembers.kt new file mode 100644 index 0000000000..182fe3c7ea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatMembers.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.SupergroupEvent + +data class NewChatMembers( + val members: List +): GroupEvent, SupergroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatPhoto.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatPhoto.kt new file mode 100644 index 0000000000..60c3e5d56c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatPhoto.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent + +data class NewChatPhoto( + val photo: List +): CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatTitle.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatTitle.kt new file mode 100644 index 0000000000..69fdcd826c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/NewChatTitle.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent + +data class NewChatTitle( + val title: String +): CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/PinnedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/PinnedMessage.kt new file mode 100644 index 0000000000..d4890bb1fa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/PinnedMessage.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.CommonEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +data class PinnedMessage( + val message: Message +): CommonEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/SupergroupChatCreated.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/SupergroupChatCreated.kt new file mode 100644 index 0000000000..676bf05ba3 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/SupergroupChatCreated.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents + +import com.github.insanusmokrassar.TelegramBotAPI.types.ChatIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.SupergroupEvent + +class SupergroupChatCreated( + val migratedFrom: ChatIdentifier? +): SupergroupEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChannelEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChannelEvent.kt new file mode 100644 index 0000000000..4acfd4b283 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChannelEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface ChannelEvent: ChatEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChatEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChatEvent.kt new file mode 100644 index 0000000000..f5fa1558af --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/ChatEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface ChatEvent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/CommonEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/CommonEvent.kt new file mode 100644 index 0000000000..8878d1a239 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/CommonEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface CommonEvent : ChannelEvent, GroupEvent, SupergroupEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/GroupEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/GroupEvent.kt new file mode 100644 index 0000000000..2a3a35de96 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/GroupEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface GroupEvent: ChatEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/SupergroupEvent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/SupergroupEvent.kt new file mode 100644 index 0000000000..b428fa279e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ChatEvents/abstracts/SupergroupEvent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts + +interface SupergroupEvent: ChatEvent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/CommonMessageImpl.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/CommonMessageImpl.kt new file mode 100644 index 0000000000..570e048407 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/CommonMessageImpl.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.User +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.CommonMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import org.joda.time.DateTime + +data class CommonMessageImpl( + override val messageId: MessageIdentifier, + val user: User, + override val chat: Chat, + override val content: T, + override val date: DateTime, + override val editDate: DateTime?, + override val forwarded: ForwardedMessage?, + override val replyTo: Message?, + val paymentInfo: PaymentInfo? +) : Message, CommonMessage \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ForwardedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ForwardedMessage.kt new file mode 100644 index 0000000000..d8a6ff5b20 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/ForwardedMessage.kt @@ -0,0 +1,23 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat + +sealed class ForwardedMessage { + abstract val messageId: MessageIdentifier + abstract val dateOfOriginal: TelegramDate +} + +data class CommonForwardedMessage( + override val messageId: MessageIdentifier, + override val dateOfOriginal: TelegramDate, + val from: User +) : ForwardedMessage() + +data class ForwardedFromChannelMessage( + override val messageId: MessageIdentifier, + override val dateOfOriginal: TelegramDate, + val from: User?, + val channelChat: Chat, + val signature: String? = null +) : ForwardedMessage() diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/GroupEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/GroupEventMessage.kt new file mode 100644 index 0000000000..2a2f7b3e45 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/GroupEventMessage.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.GroupChat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.GroupEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ChatEventMessage +import org.joda.time.DateTime + +data class GroupEventMessage( + override val messageId: MessageIdentifier, + override val chat: GroupChat, + override val chatEvent: GroupEvent, + override val date: DateTime +) : ChatEventMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/RawMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/RawMessage.kt new file mode 100644 index 0000000000..922dd39a96 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/RawMessage.kt @@ -0,0 +1,239 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.* +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.* +import com.github.insanusmokrassar.TelegramBotAPI.types.games.Game +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media.* +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.InvoiceOfPayment +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.SuccessfulPaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.Invoice +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.SuccessfulPayment +import kotlinx.serialization.* +import kotlin.reflect.KClass + +// TODO:: add PassportData type +@Serializable +data class RawMessage( + @SerialName(messageIdField) + val messageId: MessageIdentifier, + @SerialName(dateField) + val date: TelegramDate, + @SerialName(chatField) + private val chat: RawChat, + @SerialName(fromField) + @Optional + private val from: User? = null, + @Optional private val forward_from: User? = null, + @Optional private val forward_from_chat: RawChat? = null, + @Optional private val forward_from_message_id: MessageIdentifier? = null, + @Optional private val forward_signature: ForwardSignature? = null, + @Optional private val forward_date: TelegramDate? = null, + @Optional private val reply_to_message: RawMessage? = null, + @Optional private val edit_date: TelegramDate? = null, + @Optional private val media_group_id: MediaGroupIdentifier? = null, + @Optional private val author_signature: AuthorSignature? = null, + @Optional private val text: String? = null, + @Serializable(RawMessageEntitiesSerializer::class) + @Optional private val entities: RawMessageEntities? = null, + @Optional private val caption: String? = null, + @Serializable(RawMessageEntitiesSerializer::class) + @Optional private val caption_entities: RawMessageEntities? = null, + @Optional private val audio: AudioFile? = null, + @Optional private val document: DocumentFile? = null, + @Optional private val animation: AnimationFile? = null, + @Optional private val game: Game? = null, + @Serializable(PhotoSerializer::class) + @Optional private val photo: Photo? = null, + @Optional private val sticker: Sticker? = null, + @Optional private val video: VideoFile? = null, + @Optional private val voice: VoiceFile? = null, + @Optional private val video_note: VideoNoteFile? = null, + @Optional private val contact: Contact? = null, + @Optional private val location: Location? = null, + @Optional private val venue: Venue? = null, + @Optional private val new_chat_members: Array? = null, + @Optional private val left_chat_member: User? = null, + @Optional private val new_chat_title: String? = null, + @Serializable(PhotoSerializer::class) + @Optional private val new_chat_photo: Photo? = null, + @Optional private val delete_chat_photo: Boolean = false, + @Optional private val group_chat_created: Boolean = false, + @Optional private val supergroup_chat_created: Boolean = false, + @Optional private val channel_chat_created: Boolean = false, + @Optional private val migrate_to_chat_id: ChatIdentifier? = null, + @Optional private val migrate_from_chat_id: ChatIdentifier? = null, + @Optional private val pinned_message: RawMessage? = null, + @Optional private val invoice: Invoice? = null, + @Optional private val successful_payment: SuccessfulPayment? = null, + + // login property + @Optional private val connected_website: String? = null, + + // passport property + @Optional private val passport_data: Unit? = null +) { + @Transient + private val content: MessageContent? by lazy { + val adaptedCaptionEntities = caption ?.let { _ -> + caption_entities ?.map { + it.asMessageEntity(caption) + } + } ?: emptyList() + + when { + text != null -> TextContent(text, entities ?.map { it.asMessageEntity(text) } ?: emptyList()) + audio != null -> AudioContent( + audio, + caption, + adaptedCaptionEntities + ) + video != null -> VideoContent( + video, + caption, + adaptedCaptionEntities + ) + document != null -> DocumentContent( + document, + caption, + adaptedCaptionEntities + ) + voice != null -> VoiceContent( + voice, + caption, + adaptedCaptionEntities + ) + photo != null -> PhotoContent( + photo.toList(), + caption, + adaptedCaptionEntities + ) + animation != null -> AnimationContent(animation, document) + sticker != null -> StickerContent(sticker) + game != null -> GameContent(game) + video_note != null -> VideoNoteContent(video_note) + contact != null -> ContactContent(contact) + location != null -> LocationContent(location) + venue != null -> VenueContent(venue) + else -> null + } + } + + @Transient + private val forwarded: ForwardedMessage? by lazy { + forward_from_message_id ?.let { + forward_date ?: throw IllegalStateException("For forwarded messages date of original message declared as set up required") + forward_from_chat ?.let { + ForwardedFromChannelMessage( + forward_from_message_id, + forward_date, + forward_from, + forward_from_chat.extractChat(), + forward_signature + ) + } ?: CommonForwardedMessage( + forward_from_message_id, + forward_date, + forward_from + ?: throw IllegalStateException("For common forwarded messages author of original message declared as set up required") + ) + } + } + + @Transient + private val chatEvent: ChatEvent? by lazy { + when { + new_chat_members != null -> NewChatMembers(new_chat_members.toList()) + left_chat_member != null -> LeftChatMember(left_chat_member) + new_chat_title != null -> NewChatTitle(new_chat_title) + new_chat_photo != null -> NewChatPhoto(new_chat_photo.toList()) + delete_chat_photo -> DeleteChatPhoto() + group_chat_created -> GroupChatCreated( + migrate_to_chat_id + ) + supergroup_chat_created -> SupergroupChatCreated( + migrate_from_chat_id + ) + channel_chat_created -> ChannelChatCreated() + pinned_message != null -> PinnedMessage(pinned_message.asMessage) + else -> null + } + } + + @Transient + private val paymentInfo: PaymentInfo? by lazy { + when { + invoice != null -> InvoiceOfPayment(invoice) + successful_payment != null -> SuccessfulPaymentInfo(successful_payment) + else -> null + } + } + + + + @Transient + val asMessage: Message by lazy { + val chat = chat.extractChat() + + chatEvent ?.let { + chatEvent -> + when (chat) { + is GroupChat -> GroupEventMessage( + messageId, + chat, + chatEvent as? GroupEvent ?: throwWrongChatEvent(GroupChat::class, chatEvent), + date.asDate + ) + is SupergroupChat -> SupergroupEventMessage( + messageId, + chat, + chatEvent as? SupergroupEvent ?: throwWrongChatEvent(SupergroupEvent::class, chatEvent), + date.asDate + ) + is ChannelChat -> ChannelEventMessage( + messageId, + chat, + chatEvent as? ChannelEvent ?: throwWrongChatEvent(ChannelEvent::class, chatEvent), + date.asDate + ) + else -> throw IllegalStateException("Expected one of the public chats, but was $chat (in extracting of chat event message)") + } + } ?: content ?.let { + content -> + when (chat) { + is ChannelChat -> ChannelMessage( + messageId, + chat, + content, + date.asDate, + edit_date ?.asDate, + forwarded, + reply_to_message ?.asMessage, + author_signature + ) + else -> CommonMessageImpl( + messageId, + from ?: throw IllegalStateException("Was detected common message, but owner (sender) of the message was not found"), + chat, + content, + date.asDate, + edit_date ?.asDate, + forwarded, + reply_to_message ?.asMessage, + paymentInfo + ) + } + } ?: throw IllegalStateException("Was not found supported type of data") + } + + private fun throwWrongChatEvent(expected: KClass<*>, but: ChatEvent): CommonEvent { + throw IllegalStateException("Wrong type of chat event: expected $expected, but was $but") + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/SupergroupEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/SupergroupEventMessage.kt new file mode 100644 index 0000000000..d767299b35 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/SupergroupEventMessage.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.SupergroupChat +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.SupergroupEvent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.ChatEventMessage +import org.joda.time.DateTime + +data class SupergroupEventMessage( + override val messageId: MessageIdentifier, + override val chat: SupergroupChat, + override val chatEvent: SupergroupEvent, + override val date: DateTime +) : ChatEventMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeEditedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeEditedMessage.kt new file mode 100644 index 0000000000..c3213ef9f4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeEditedMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import org.joda.time.DateTime + +interface AbleToBeEditedMessage : Message { + val editDate: DateTime? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeForwardedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeForwardedMessage.kt new file mode 100644 index 0000000000..c1acd3a459 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBeForwardedMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ForwardedMessage + +interface AbleToBeForwardedMessage : Message { + val forwarded: ForwardedMessage? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBePaymentedMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBePaymentedMessage.kt new file mode 100644 index 0000000000..5a879b9e9c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToBePaymentedMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo + +interface AbleToBePaymentedMessage : Message { + val paymentInfo: PaymentInfo? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToReplyMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToReplyMessage.kt new file mode 100644 index 0000000000..3cbe77739e --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/AbleToReplyMessage.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +interface AbleToReplyMessage { + val replyTo: Message? +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ChatEventMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ChatEventMessage.kt new file mode 100644 index 0000000000..83c1b4bb0b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ChatEventMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.ChatEvents.abstracts.ChatEvent + +interface ChatEventMessage : Message { + val chatEvent: ChatEvent +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/CommonMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/CommonMessage.kt new file mode 100644 index 0000000000..6a76684b95 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/CommonMessage.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +interface CommonMessage : Message, + AbleToBeForwardedMessage, + AbleToBeEditedMessage, + AbleToReplyMessage, + ContentMessage diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ContentMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ContentMessage.kt new file mode 100644 index 0000000000..e46d31fa86 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/ContentMessage.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +interface ContentMessage: Message { + val content: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/MediaGroupMessage.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/MediaGroupMessage.kt new file mode 100644 index 0000000000..96f376b51c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/MediaGroupMessage.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaGroupContent + +interface MediaGroupMessage { + val mediaGroupId: String + val content: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/Message.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/Message.kt new file mode 100644 index 0000000000..a448e9f804 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/abstracts/Message.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.chat.Chat +import org.joda.time.DateTime + +interface Message { + val messageId: MessageIdentifier + val chat: Chat + val date: DateTime +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/ContactContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/ContactContent.kt new file mode 100644 index 0000000000..67b16e3a9c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/ContactContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.Contact +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class ContactContent( + val contact: Contact +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/GameContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/GameContent.kt new file mode 100644 index 0000000000..3c4eff1bc6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/GameContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.games.Game +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class GameContent( + val game: Game +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/LocationContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/LocationContent.kt new file mode 100644 index 0000000000..60f5d6b0ae --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/LocationContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.Location +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class LocationContent( + val location: Location +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt new file mode 100644 index 0000000000..6350980692 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/TextContent.kt @@ -0,0 +1,9 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class TextContent( + val text: String, + val entities: List = emptyList() +) : MessageContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/VenueContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/VenueContent.kt new file mode 100644 index 0000000000..f86882e707 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/VenueContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content + +import com.github.insanusmokrassar.TelegramBotAPI.types.Venue +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MessageContent + +data class VenueContent( + val venue: Venue +) : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/CaptionedMediaContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/CaptionedMediaContent.kt new file mode 100644 index 0000000000..5f64ac8cb2 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/CaptionedMediaContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity + +interface CaptionedMediaContent { + val caption: String? + val captionEntities: List +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaCollectionContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaCollectionContent.kt new file mode 100644 index 0000000000..a815289302 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaCollectionContent.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.TelegramMediaFile + +interface MediaCollectionContent: MessageContent { + val media: List +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaContent.kt new file mode 100644 index 0000000000..fe3d48b712 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaContent.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.abstracts.TelegramMediaFile + +interface MediaContent: MessageContent { + val media: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaGroupContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaGroupContent.kt new file mode 100644 index 0000000000..587efd1fea --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MediaGroupContent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +interface MediaGroupContent : MessageContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MessageContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MessageContent.kt new file mode 100644 index 0000000000..7bf160e344 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/abstracts/MessageContent.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts + +interface MessageContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AnimationContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AnimationContent.kt new file mode 100644 index 0000000000..c6c67fb264 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AnimationContent.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.AnimationFile +import com.github.insanusmokrassar.TelegramBotAPI.types.files.DocumentFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class AnimationContent( + override val media: AnimationFile, + val includedDocument: DocumentFile? +) : MediaContent \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt new file mode 100644 index 0000000000..e2c048f82b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/AudioContent.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.AudioFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class AudioContent( + override val media: AudioFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt new file mode 100644 index 0000000000..dc9607adc4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/DocumentContent.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.DocumentFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class DocumentContent( + override val media: DocumentFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt new file mode 100644 index 0000000000..1fa526eb78 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/PhotoContent.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.PhotoSize +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.* + +data class PhotoContent( + override val media: List, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaCollectionContent, CaptionedMediaContent, MediaGroupContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/StickerContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/StickerContent.kt new file mode 100644 index 0000000000..bf7bc4e48c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/StickerContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.Sticker +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class StickerContent( + override val media: Sticker +) : MediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt new file mode 100644 index 0000000000..edf2c4ae38 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoContent.kt @@ -0,0 +1,11 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.VideoFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.* + +data class VideoContent( + override val media: VideoFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent, MediaGroupContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoNoteContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoNoteContent.kt new file mode 100644 index 0000000000..ab5020d1b1 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VideoNoteContent.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.files.VideoNoteFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class VideoNoteContent( + override val media: VideoNoteFile +) : MediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt new file mode 100644 index 0000000000..a54bb148c9 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/content/media/VoiceContent.kt @@ -0,0 +1,12 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.content.media + +import com.github.insanusmokrassar.TelegramBotAPI.types.MessageEntity.MessageEntity +import com.github.insanusmokrassar.TelegramBotAPI.types.files.VoiceFile +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.CaptionedMediaContent +import com.github.insanusmokrassar.TelegramBotAPI.types.message.content.abstracts.MediaContent + +data class VoiceContent( + override val media: VoiceFile, + override val caption: String? = null, + override val captionEntities: List = emptyList() +) : MediaContent, CaptionedMediaContent diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/InvoiceOfPayment.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/InvoiceOfPayment.kt new file mode 100644 index 0000000000..7f90a9f438 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/InvoiceOfPayment.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.Invoice + +data class InvoiceOfPayment( + val invoice: Invoice +) : PaymentInfo diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/SuccessfulPaymentInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/SuccessfulPaymentInfo.kt new file mode 100644 index 0000000000..f769e02fa4 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/SuccessfulPaymentInfo.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts.PaymentInfo +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.SuccessfulPayment + +data class SuccessfulPaymentInfo( + val payment: SuccessfulPayment +) : PaymentInfo diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/abstracts/PaymentInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/abstracts/PaymentInfo.kt new file mode 100644 index 0000000000..d526310e13 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/message/payments/abstracts/PaymentInfo.kt @@ -0,0 +1,3 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.message.payments.abstracts + +interface PaymentInfo diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/Invoice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/Invoice.kt new file mode 100644 index 0000000000..1d76520acf --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/Invoice.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable +import java.util.* + +@Serializable +data class Invoice( + @SerialName(titleField) + val title: String, + @SerialName(descriptionField) + val description: String, + @SerialName(startParameterField) + val startParameter: StartParameter, + @Serializable(CurrencySerializer::class) + @SerialName(currencyField) + override val currency: Currency, + @SerialName(totalAmountField) + override val amount: Long +) : Amounted, Currencied diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/LabeledPrice.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/LabeledPrice.kt new file mode 100644 index 0000000000..fd1ea47baa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/LabeledPrice.kt @@ -0,0 +1,14 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.Amounted +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class LabeledPrice( + @SerialName(labelField) + val label: String, + @SerialName(amountField) + override val amount: Long +) : Amounted diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/OrderInfo.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/OrderInfo.kt new file mode 100644 index 0000000000..29117ffa25 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/OrderInfo.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class OrderInfo( + @SerialName(nameField) + val name: String, + @SerialName(phoneNumberField) + val phoneNumber: String, + @SerialName(emailField) + val email: String, + @SerialName(shippingAddressField) + val shippingAddress: ShippingAddress +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/PreCheckoutQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/PreCheckoutQuery.kt new file mode 100644 index 0000000000..0148d2c5ca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/PreCheckoutQuery.kt @@ -0,0 +1,29 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.* +import kotlinx.serialization.* +import kotlinx.serialization.Optional +import java.util.* + +// TODO:: separate to normal classes hierarchy +@Serializable +data class PreCheckoutQuery( + @SerialName(idField) + val id: PreCheckoutQueryId, + @SerialName(fromField) + val user: User, + @Serializable(CurrencySerializer::class) + @SerialName(currencyField) + override val currency: Currency, + @SerialName(totalAmountField) + override val amount: Long, + @SerialName(invoicePayloadField) + val invoicePayload: InvoicePayload, + @SerialName(shippingOptionIdField) + @Optional + val shippingOptionId: ShippingOptionIdentifier? = null, + @SerialName(orderInfoField) + @Optional + val orderInfo: OrderInfo? = null +) : Currencied, Amounted diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingAddress.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingAddress.kt new file mode 100644 index 0000000000..ade1e1a320 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingAddress.kt @@ -0,0 +1,22 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.* + +@Serializable +data class ShippingAddress( + @SerialName(countryCodeField) + val countryCode: String, + @SerialName(cityField) + val city: String, + @SerialName(firstStreetLineField) + val firstStreetLine: String, + @SerialName(secondStreetLineField) + val secondStreetLine: String, + @SerialName(stateField) + @Optional + val state: String = "", + @SerialName(postCodeField) + @Optional + val postCode: String = "" +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingOption.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingOption.kt new file mode 100644 index 0000000000..ebdc3866db --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingOption.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.Priced +import kotlinx.serialization.* +import kotlinx.serialization.internal.ArrayListSerializer + +@Serializable +data class ShippingOption( + @SerialName(idField) + val id: ShippingOptionIdentifier, + @SerialName(titleField) + val title: String, + @Serializable(LabeledPricesSerializer::class) + @SerialName(pricesField) + override val prices: List +) : Priced + +object LabeledPricesSerializer : KSerializer> by ArrayListSerializer( + LabeledPrice.serializer() +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingQuery.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingQuery.kt new file mode 100644 index 0000000000..a51b028e57 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/ShippingQuery.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class ShippingQuery( + @SerialName(idField) + val id: ShippingQueryIdentifier, + @SerialName(fromField) + val user: User, + @SerialName(invoicePayloadField) + val invoicePayload: InvoicePayload, + @SerialName(shippingAddressField) + val shippingAddress: ShippingAddress +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/SuccessfulPayment.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/SuccessfulPayment.kt new file mode 100644 index 0000000000..68f0d5fec0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/SuccessfulPayment.kt @@ -0,0 +1,28 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts.* +import kotlinx.serialization.* +import kotlinx.serialization.Optional +import java.util.* + +@Serializable +data class SuccessfulPayment( + @Serializable(CurrencySerializer::class) + @SerialName(currencyField) + override val currency: Currency, + @SerialName(totalAmountField) + override val amount: Long, + @SerialName(invoicePayloadField) + val invoicePayload: String, + @SerialName(telegramPaymentChargeIdField) + val telegramPaymentChargeId: String, + @SerialName(providerPaymentChargeIdField) + val providerPaymentChargeId: String, + @SerialName(shippingOptionIdField) + @Optional + val shippingOptionId: String? = null, + @SerialName(orderInfoField) + @Optional + val orderInfo: OrderInfo? = null +) : Amounted, Currencied diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Amounted.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Amounted.kt new file mode 100644 index 0000000000..50e1a05c4c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Amounted.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts + +interface Amounted { + val amount: Long + val adaptedMajorityTotalAmount: Double + get() = amount / 100.0 +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Currencied.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Currencied.kt new file mode 100644 index 0000000000..b0184bda99 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Currencied.kt @@ -0,0 +1,21 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts + +import kotlinx.serialization.* +import java.util.* + +interface Currencied { + val currency: Currency +} + +@Serializer(Currency::class) +object CurrencySerializer : KSerializer { + override fun serialize(output: Encoder, obj: Currency) { + output.encodeString(obj.currencyCode) + } + + override fun deserialize(input: Decoder): Currency { + return input.decodeString().let { + Currency.getInstance(it) + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Priced.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Priced.kt new file mode 100644 index 0000000000..d836470a82 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/payments/abstracts/Priced.kt @@ -0,0 +1,7 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.payments.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.LabeledPrice + +interface Priced { + val prices: List +} \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/MaskPosition.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/MaskPosition.kt new file mode 100644 index 0000000000..b2084697f0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/MaskPosition.kt @@ -0,0 +1,17 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +data class MaskPosition( + @SerialName(pointField) + val point: String, + @SerialName(xShiftField) + val xShift: Float, + @SerialName(yShiftField) + val yShift: Float, + @SerialName(scaleField) + val scale: Float +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/StickerSet.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/StickerSet.kt new file mode 100644 index 0000000000..19f8a48121 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/stickers/StickerSet.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.stickers + +import com.github.insanusmokrassar.TelegramBotAPI.types.* +import com.github.insanusmokrassar.TelegramBotAPI.types.files.Sticker +import kotlinx.serialization.* + +@Serializable +data class StickerSet( + @SerialName(nameField) + val name: String, + @SerialName(titleField) + val title: String, + @SerialName(stickersField) + val stickers: List, + @SerialName(containsMasksField) + @Optional + val containsMasks: Boolean = false +) diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/CallbackQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/CallbackQueryUpdate.kt new file mode 100644 index 0000000000..2912b1afc0 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/CallbackQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.CallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class CallbackQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: CallbackQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChannelPostUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChannelPostUpdate.kt new file mode 100644 index 0000000000..3b5af5d8aa --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChannelPostUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class ChannelPostUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChosenInlineResultUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChosenInlineResultUpdate.kt new file mode 100644 index 0000000000..329bb77d24 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ChosenInlineResultUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class ChosenInlineResultUpdate( + override val updateId: UpdateIdentifier, + override val data: ChosenInlineResult +) : Update \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditChannelPostUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditChannelPostUpdate.kt new file mode 100644 index 0000000000..621e5c8570 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditChannelPostUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class EditChannelPostUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditMessageUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditMessageUpdate.kt new file mode 100644 index 0000000000..82414a2220 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/EditMessageUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class EditMessageUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/InlineQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/InlineQueryUpdate.kt new file mode 100644 index 0000000000..a5b82a311d --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/InlineQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class InlineQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: InlineQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MessageUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MessageUpdate.kt new file mode 100644 index 0000000000..c5779d9cca --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/MessageUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.BaseMessageUpdate + +data class MessageUpdate( + override val updateId: UpdateIdentifier, + override val data: Message +) : BaseMessageUpdate diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/PreCheckoutQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/PreCheckoutQueryUpdate.kt new file mode 100644 index 0000000000..70c22a4027 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/PreCheckoutQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class PreCheckoutQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: PreCheckoutQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/RawUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/RawUpdate.kt new file mode 100644 index 0000000000..63991bd96b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/RawUpdate.kt @@ -0,0 +1,46 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.RawCallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.ChosenInlineResult.RawChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.query.RawInlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.RawMessage +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update +import com.github.insanusmokrassar.TelegramBotAPI.types.updateIdField +import kotlinx.serialization.* + +// TODO:: add ShippingQuery type +// TODO:: add PreCheckoutQuery type +@Serializable +data class RawUpdate constructor( + @SerialName(updateIdField) + val updateId: UpdateIdentifier, + @Optional private val message: RawMessage? = null, + @Optional private val edited_message: RawMessage? = null, + @Optional private val channel_post: RawMessage? = null, + @Optional private val edited_channel_post: RawMessage? = null, + @Optional private val inline_query: RawInlineQuery? = null, + @Optional private val chosen_inline_result: RawChosenInlineResult? = null, + @Optional private val callback_query: RawCallbackQuery? = null, + @Optional private val shipping_query: ShippingQuery? = null, + @Optional private val pre_checkout_query: PreCheckoutQuery? = null +) { + @Transient + val asUpdate: Update<*> by lazy { + when { + message != null -> MessageUpdate(updateId, message.asMessage) + edited_message != null -> EditMessageUpdate(updateId, edited_message.asMessage) + channel_post != null -> ChannelPostUpdate(updateId, channel_post.asMessage) + edited_channel_post != null -> EditChannelPostUpdate(updateId, edited_channel_post.asMessage) + + chosen_inline_result != null -> ChosenInlineResultUpdate(updateId, chosen_inline_result.asChosenInlineResult) + inline_query != null -> InlineQueryUpdate(updateId, inline_query.asInlineQuery) + callback_query != null -> CallbackQueryUpdate(updateId, callback_query.asCallbackQuery) + shipping_query != null -> ShippingQueryUpdate(updateId, shipping_query) + pre_checkout_query != null -> PreCheckoutQueryUpdate(updateId, pre_checkout_query) + else -> throw IllegalArgumentException("Unsupported type of update") + } + } +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ShippingQueryUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ShippingQueryUpdate.kt new file mode 100644 index 0000000000..51143da3d8 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/ShippingQueryUpdate.kt @@ -0,0 +1,10 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update + +data class ShippingQueryUpdate( + override val updateId: UpdateIdentifier, + override val data: ShippingQuery +) : Update diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/BaseMessageUpdate.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/BaseMessageUpdate.kt new file mode 100644 index 0000000000..147c4edea6 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/BaseMessageUpdate.kt @@ -0,0 +1,5 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message + +interface BaseMessageUpdate : Update \ No newline at end of file diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/Update.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/Update.kt new file mode 100644 index 0000000000..8b8029724c --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/types/update/abstracts/Update.kt @@ -0,0 +1,8 @@ +package com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts + +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier + +interface Update { + val updateId: UpdateIdentifier + val data: T +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt new file mode 100644 index 0000000000..792b70cf2a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/JSON.kt @@ -0,0 +1,47 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import kotlinx.serialization.* +import kotlinx.serialization.json.* + +@ImplicitReflectionSerializer +inline fun T.toJsonWithoutNulls(): JsonObject = toJson(serializerByValue(this)).withoutNulls() + +inline fun T.toJsonWithoutNulls(serializer: KSerializer): JsonObject = toJson(serializer).withoutNulls() + +inline fun T.toJson(serializer: KSerializer): JsonObject = JsonTreeMapper().writeTree( + this, + serializer +).jsonObject + +fun JsonArray.withoutNulls(): JsonArray { + return jsonArray { + forEach { + when (it) { + is JsonObject -> +it.withoutNulls() + is JsonArray -> +it.withoutNulls() + is JsonPrimitive -> +it + } + } + } +} + +fun JsonObject.withoutNulls(): JsonObject { + return json { + forEach { (k, v) -> + when (v) { + is JsonObject -> k to v.withoutNulls() + is JsonArray -> k to v.withoutNulls() + !is JsonNull -> k to v + } + } + } +} + +fun JsonObject.mapWithCommonValues(): Map = map { + (key, value) -> + key to when (value) { + is JsonPrimitive -> value.contentOrNull ?: value.booleanOrNull ?: value.doubleOrNull ?: value.floatOrNull ?: value.intOrNull + is JsonArray, is JsonObject -> value.toString() + is JsonNull -> null + } +}.toMap().mapNotNullValues() diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Map.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Map.kt new file mode 100644 index 0000000000..dcef012a1b --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Map.kt @@ -0,0 +1,18 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +fun mapOfNotNull(vararg pairs: Pair): Map { + return HashMap().apply { + pairs.forEach { + (key, value) -> + value ?.also { + put(key, it) + } + } + } +} + +fun Map.mapNotNullValues(): Map = asSequence().mapNotNull { + it.value ?.let { value -> + it.key to value + } +}.toMap() diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Matrix.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Matrix.kt new file mode 100644 index 0000000000..08a661542a --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/Matrix.kt @@ -0,0 +1,32 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils + +import com.github.insanusmokrassar.TelegramBotAPI.types.buttons.Matrix + +fun row(block: RowBuilder.() -> Unit): List { + return RowBuilder().also(block).row +} + +fun MatrixBuilder.row(block: RowBuilder.() -> Unit) { + add(RowBuilder().also(block).row) +} + +fun matrix(block: MatrixBuilder.() -> Unit): Matrix { + return MatrixBuilder().also(block).matrix +} + +class RowBuilder { + private val mutRow: MutableList = ArrayList() + val row: List + get() = mutRow + + fun add(t: T) = mutRow.add(t) +} + +class MatrixBuilder { + private val mutMatrix: MutableList> = ArrayList() + val matrix: Matrix + get() = mutMatrix + + fun add(t: List) = mutMatrix.add(t) + operator fun plus(t: List) = add(t) +} diff --git a/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/RequestsExecutor.kt b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/RequestsExecutor.kt new file mode 100644 index 0000000000..66644ff849 --- /dev/null +++ b/src/main/kotlin/com/github/insanusmokrassar/TelegramBotAPI/utils/extensions/RequestsExecutor.kt @@ -0,0 +1,131 @@ +package com.github.insanusmokrassar.TelegramBotAPI.utils.extensions + +import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestException +import com.github.insanusmokrassar.TelegramBotAPI.bot.RequestsExecutor +import com.github.insanusmokrassar.TelegramBotAPI.types.CallbackQuery.CallbackQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.ChosenInlineResult +import com.github.insanusmokrassar.TelegramBotAPI.types.InlineQueries.abstracts.InlineQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.ResponseParameters +import com.github.insanusmokrassar.TelegramBotAPI.types.UpdateIdentifier +import com.github.insanusmokrassar.TelegramBotAPI.types.message.abstracts.Message +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.PreCheckoutQuery +import com.github.insanusmokrassar.TelegramBotAPI.types.payments.ShippingQuery +import com.github.insanusmokrassar.TelegramBotAPI.requests.* +import com.github.insanusmokrassar.TelegramBotAPI.requests.abstracts.Request +import com.github.insanusmokrassar.TelegramBotAPI.types.update.* +import com.github.insanusmokrassar.TelegramBotAPI.types.update.abstracts.Update +import kotlinx.coroutines.* + +typealias UpdateReceiver = suspend Update.() -> Unit + +fun RequestsExecutor.startGettingOfUpdates( + requestsDelayMillis: Long = 1000, + scope: CoroutineScope = GlobalScope, + allowedUpdates: List? = null, + block: UpdateReceiver<*> +): Job { + return scope.launch { + var lastHandledUpdate: UpdateIdentifier = 0L + while (isActive) { + delay(requestsDelayMillis) + try { + val updates = execute( + GetUpdates( + lastHandledUpdate + 1, + allowed_updates = allowedUpdates + ) + ) + + for (rawUpdate in updates) { + try { + val update = rawUpdate.asUpdate + block(update) + lastHandledUpdate = update.updateId + } catch (e: Exception) { + // TODO:: add exception handling + e.printStackTrace() + break + } + } + } catch (e: Exception) { + // TODO:: add exception handling + e.printStackTrace() + } + } + } +} + +fun RequestsExecutor.startGettingOfUpdates( + messageCallback: UpdateReceiver? = null, + editedMessageCallback: UpdateReceiver? = null, + channelPostCallback: UpdateReceiver? = null, + editedChannelPostCallback: UpdateReceiver? = null, + chosenInlineResultCallback: UpdateReceiver? = null, + inlineQueryCallback: UpdateReceiver? = null, + callbackQueryCallback: UpdateReceiver? = null, + shippingQueryCallback: UpdateReceiver? = null, + preCheckoutQueryCallback: UpdateReceiver? = null, + requestsDelayMillis: Long = 1000, + scope: CoroutineScope = GlobalScope +): Job { + return startGettingOfUpdates( + requestsDelayMillis, + scope, + listOfNotNull( + messageCallback ?.let { UPDATE_MESSAGE }, + editedMessageCallback ?.let { UPDATE_EDITED_MESSAGE }, + channelPostCallback ?.let { UPDATE_CHANNEL_POST }, + editedChannelPostCallback ?.let { UPDATE_EDITED_CHANNEL_POST }, + chosenInlineResultCallback ?.let { UPDATE_CHOSEN_INLINE_RESULT }, + inlineQueryCallback ?.let { UPDATE_INLINE_QUERY }, + callbackQueryCallback ?.let { UPDATE_CALLBACK_QUERY }, + shippingQueryCallback ?.let { UPDATE_SHIPPING_QUERY }, + preCheckoutQueryCallback ?.let { UPDATE_PRE_CHECKOUT_QUERY } + ) + ) { + when (this) { + is MessageUpdate -> messageCallback ?.invoke(this) + is EditMessageUpdate -> editedMessageCallback ?.invoke(this) + is ChannelPostUpdate -> channelPostCallback ?.invoke(this) + is EditChannelPostUpdate -> editedChannelPostCallback ?.invoke(this) + is ChosenInlineResultUpdate -> chosenInlineResultCallback ?.invoke(this) + is InlineQueryUpdate -> inlineQueryCallback ?.invoke(this) + is CallbackQueryUpdate -> callbackQueryCallback ?.invoke(this) + is ShippingQueryUpdate -> shippingQueryCallback ?.invoke(this) + is PreCheckoutQueryUpdate -> preCheckoutQueryCallback ?.invoke(this) + } + } +} + +fun RequestsExecutor.executeAsync( + request: Request, + onFail: (suspend (ResponseParameters<*>) -> Unit)? = null, + scope: CoroutineScope = GlobalScope, + onSuccess: (suspend (T) -> Unit)? = null +): Job { + return scope.launch { + try { + val result = execute(request) + onSuccess ?.invoke(result) + } catch (e: RequestException) { + onFail ?.invoke(e.response) + } + } +} + +fun RequestsExecutor.executeAsync( + request: Request, + scope: CoroutineScope = GlobalScope +): Job { + return scope.async { execute(request) } +} + +suspend fun RequestsExecutor.executeUnsafe( + request: Request +): T? { + return try { + execute(request) + } catch (e: RequestException) { + null + } +}