diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index ceab9f2..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Build - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 1.8 - uses: actions/setup-java@v1 - with: - java-version: 1.8 - - name: Build with Gradle - run: ./gradlew build diff --git a/.github/workflows/publish_package.yml b/.github/workflows/publish_package.yml new file mode 100644 index 0000000..6e92767 --- /dev/null +++ b/.github/workflows/publish_package.yml @@ -0,0 +1,27 @@ + +name: Publish package to GitHub Packages +on: [push] +jobs: + publishing: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Update version + run: | + branch="`echo "${{ github.ref }}" | grep -o "[^/]*$"`" + sed -i -e "s/^project_version=\([0-9\.]*\)/project_version=\1-branch_$branch-build${{ github.run_number }}/" gradle.properties + - name: prebuild + run: ./gradlew clean build + env: + GITHUB_USER: ${{ github.actor }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Publish package + run: ./gradlew publishAllPublicationsToGithubPackagesRepository --no-parallel -x signMavenPublication + env: + GITHUBPACKAGES_USER: ${{ github.actor }} + GITHUBPACKAGES_PASSWORD: ${{ secrets.GITHUB_TOKEN }} + GITHUB_USER: ${{ github.actor }} + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/build.gradle b/build.gradle index b4d76dd..9a3afa7 100644 --- a/build.gradle +++ b/build.gradle @@ -17,12 +17,22 @@ plugins { apply from: "./publish.gradle" project.group = "$project_group" -project.version = "$plagubot_version" +project.version = "$project_version" repositories { mavenLocal() mavenCentral() jcenter() + if ((project.hasProperty("GITHUB_USER") || System.getenv("GITHUB_USER") != null) && (project.hasProperty("GITHUB_TOKEN") || System.getenv("GITHUB_TOKEN") != null)) { + maven { + name = "GitHubPackages" + url = uri("https://maven.pkg.github.com/InsanusMokrassar/TelegramBotApiLibraries") + credentials { + username = project.hasProperty("GITHUB_USER") ? project.getProperty("GITHUB_USER") : System.getenv("GITHUB_USER") + password = project.hasProperty("GITHUB_TOKEN") ? project.getProperty("GITHUB_TOKEN") : System.getenv("GITHUB_TOKEN") + } + } + } } dependencies { @@ -32,4 +42,5 @@ dependencies { api "dev.inmo:plagubot.plugin:$plagubot_version" api "dev.inmo:micro_utils.repos.exposed:$micro_utils_version" + api "dev.inmo:tgbotapi.libraries.cache.admins.plagubot:$tgbotapi_libraries_version" } diff --git a/gradle.properties b/gradle.properties index 09ccc20..9dbca96 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,11 +4,13 @@ org.gradle.parallel=true kotlin.js.generate.externals=true kotlin.incremental=true -kotlin_version=1.4.30 -kotlin_coroutines_version=1.4.2 -kotlin_serialisation_runtime_version=1.1.0-RC -plagubot_version=0.1.3 +kotlin_version=1.4.31 +kotlin_coroutines_version=1.4.3 +kotlin_serialisation_runtime_version=1.1.0 +plagubot_version=0.1.5 -micro_utils_version=0.4.25 +micro_utils_version=0.4.30 +tgbotapi_libraries_version=0.0.2-branch_master-build11 project_group=dev.inmo +project_version=0.1.4 diff --git a/publish.gradle b/publish.gradle index 2b0669b..695b63b 100644 --- a/publish.gradle +++ b/publish.gradle @@ -51,12 +51,24 @@ publishing { } } repositories { - maven { - name = "sonatype" - url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") - credentials { - username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER') - password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') + if ((project.hasProperty('GITHUBPACKAGES_USER') || System.getenv('GITHUBPACKAGES_USER') != null) && (project.hasProperty('GITHUBPACKAGES_PASSWORD') || System.getenv('GITHUBPACKAGES_PASSWORD') != null)) { + maven { + name = "GithubPackages" + url = uri("https://maven.pkg.github.com/InsanusMokrassar/CaptchaPlaguBotPlugin") + credentials { + username = project.hasProperty('GITHUBPACKAGES_USER') ? project.property('GITHUBPACKAGES_USER') : System.getenv('GITHUBPACKAGES_USER') + password = project.hasProperty('GITHUBPACKAGES_PASSWORD') ? project.property('GITHUBPACKAGES_PASSWORD') : System.getenv('GITHUBPACKAGES_PASSWORD') + } + } + } + if ((project.hasProperty('SONATYPE_USER') || System.getenv('SONATYPE_USER') != null) && (project.hasProperty('SONATYPE_PASSWORD') || System.getenv('SONATYPE_PASSWORD') != null)) { + maven { + name = "sonatype" + url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") + credentials { + username = project.hasProperty('SONATYPE_USER') ? project.property('SONATYPE_USER') : System.getenv('SONATYPE_USER') + password = project.hasProperty('SONATYPE_PASSWORD') ? project.property('SONATYPE_PASSWORD') : System.getenv('SONATYPE_PASSWORD') + } } } } diff --git a/maven publish.kpsb b/publish.kpsb similarity index 52% rename from maven publish.kpsb rename to publish.kpsb index f82c833..0c6898a 100644 --- a/maven publish.kpsb +++ b/publish.kpsb @@ -1 +1 @@ -{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/CaptchaPlaguBotPlugin/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"${project.name}","url":"https://github.com/InsanusMokrassar/CaptchaPlaguBotPlugin","vcsUrl":"https://github.com/InsanusMokrassar/CaptchaPlaguBotPlugin.git","includeGpgSigning":true,"publishToMavenCentral":true,"developers":[{"id":"InsanusMokrassar","name":"Ovsiannikov Aleksei","eMail":"ovsyannikov.alexey95@gmail.com"}]},"type":"JVM"} \ No newline at end of file +{"licenses":[{"id":"Apache-2.0","title":"Apache Software License 2.0","url":"https://github.com/InsanusMokrassar/CaptchaPlaguBotPlugin/blob/master/LICENSE"}],"mavenConfig":{"name":"${project.name}","description":"${project.name}","url":"https://github.com/InsanusMokrassar/CaptchaPlaguBotPlugin","vcsUrl":"https://github.com/InsanusMokrassar/CaptchaPlaguBotPlugin.git","includeGpgSigning":true,"developers":[{"id":"InsanusMokrassar","name":"Ovsiannikov Aleksei","eMail":"ovsyannikov.alexey95@gmail.com"}],"repositories":[{"name":"GithubPackages","url":"https://maven.pkg.github.com/InsanusMokrassar/CaptchaPlaguBotPlugin"},{"name":"sonatype","url":"https://oss.sonatype.org/service/local/staging/deploy/maven2/"}]},"type":"JVM"} \ No newline at end of file diff --git a/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/Plugin.kt b/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/Plugin.kt index 09db1bf..e4e6f91 100644 --- a/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/Plugin.kt +++ b/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/Plugin.kt @@ -16,32 +16,55 @@ import dev.inmo.tgbotapi.extensions.api.send.sendTextMessage import dev.inmo.tgbotapi.extensions.behaviour_builder.* import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitBaseInlineQuery import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitDataCallbackQuery +import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onNewChatMembers import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.extensions.utils.formatting.buildEntities import dev.inmo.tgbotapi.extensions.utils.formatting.regular import dev.inmo.tgbotapi.extensions.utils.shortcuts.executeUnsafe +import dev.inmo.tgbotapi.libraries.cache.admins.* import dev.inmo.tgbotapi.requests.DeleteMessage +import dev.inmo.tgbotapi.types.BotCommand import dev.inmo.tgbotapi.types.MessageEntity.textsources.mention import dev.inmo.tgbotapi.types.User import dev.inmo.tgbotapi.types.chat.ChatPermissions import dev.inmo.tgbotapi.types.chat.LeftRestrictionsChatPermissions +import dev.inmo.tgbotapi.types.chat.abstracts.Chat +import dev.inmo.tgbotapi.types.chat.abstracts.PublicChat import dev.inmo.tgbotapi.types.dice.SlotMachineDiceAnimationType -import dev.inmo.tgbotapi.types.message.abstracts.Message +import dev.inmo.tgbotapi.types.message.abstracts.* +import dev.inmo.tgbotapi.types.message.content.abstracts.MessageContent import kotlinx.coroutines.* import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.toList import kotlinx.serialization.Serializable import org.jetbrains.exposed.sql.Database +private const val enableAutoDeleteCommands = "captcha_auto_delete_commands_on" +private const val disableAutoDeleteCommands = "captcha_auto_delete_commands_off" + @Serializable class CaptchaBotPlugin : Plugin { + override suspend fun getCommands(): List = listOf( + BotCommand( + enableAutoDeleteCommands, + "Enable auto removing of commands addressed to captcha plugin" + ), + BotCommand( + disableAutoDeleteCommands, + "Disable auto removing of commands addressed to captcha plugin" + ) + ) + override suspend fun BehaviourContext.invoke( database: Database, params: Map ) { val repo = CaptchaChatsSettingsRepo(database) + val adminsAPI = params.adminsPlugin ?.adminsAPI(database) + suspend fun Chat.settings() = repo.getById(id) ?: repo.create(ChatSettings(id)).first() + onNewChatMembers( additionalFilter = { it.chat.asPublicChat() != null @@ -59,7 +82,7 @@ class CaptchaBotPlugin : Plugin { permissions = ChatPermissions() ) } - val settings = repo.getById(it.chat.id) ?: repo.create(ChatSettings(it.chat.id)).firstOrNull() ?: return@onNewChatMembers + val settings = it.chat.settings() ?: return@onNewChatMembers val userBanDateTime = eventDateTime + settings.checkTimeSpan val authorized = Channel(newUsers.size) val messagesToDelete = Channel(Channel.UNLIMITED) @@ -128,5 +151,36 @@ class CaptchaBotPlugin : Plugin { executeUnsafe(DeleteMessage(message.chat.id, message.messageId), retries = 0) } } + + if (adminsAPI != null) { + onCommand( + enableAutoDeleteCommands, + requireOnlyCommandInMessage = false + ) { message -> + message.doAfterVerification(adminsAPI) { + val settings = message.chat.settings() + + repo.update( + message.chat.id, + settings.copy(autoRemoveCommands = true) + ) + + deleteMessage(message) + } + } + onCommand( + disableAutoDeleteCommands, + requireOnlyCommandInMessage = false + ) { message -> + message.doAfterVerification(adminsAPI) { + val settings = message.chat.settings() + + repo.update( + message.chat.id, + settings.copy(autoRemoveCommands = false) + ) + } + } + } } } diff --git a/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/db/CaptchaChatsSettingsRepo.kt b/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/db/CaptchaChatsSettingsRepo.kt index 44c631d..6985139 100644 --- a/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/db/CaptchaChatsSettingsRepo.kt +++ b/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/db/CaptchaChatsSettingsRepo.kt @@ -17,6 +17,7 @@ class CaptchaChatsSettingsRepo( private val chatIdColumn = long("chatId") private val checkTimeSecondsColumn = integer("checkTime") private val solveCaptchaTextColumn = text("solveCaptchaText") + private val autoRemoveCommandsColumn = bool("autoRemoveCommands") override val primaryKey = PrimaryKey(chatIdColumn) @@ -30,19 +31,22 @@ class CaptchaChatsSettingsRepo( it[chatIdColumn] = value.chatId.chatId it[checkTimeSecondsColumn] = value.checkTime it[solveCaptchaTextColumn] = value.captchaText + it[autoRemoveCommandsColumn] = value.autoRemoveCommands } override fun update(id: ChatId, value: ChatSettings, it: UpdateStatement) { if (id.chatId == value.chatId.chatId) { it[checkTimeSecondsColumn] = value.checkTime it[solveCaptchaTextColumn] = value.captchaText + it[autoRemoveCommandsColumn] = value.autoRemoveCommands } } override fun InsertStatement.asObject(value: ChatSettings): ChatSettings = ChatSettings( get(chatIdColumn).toChatId(), get(checkTimeSecondsColumn), - get(solveCaptchaTextColumn) + get(solveCaptchaTextColumn), + get(autoRemoveCommandsColumn) ) override val selectById: SqlExpressionBuilder.(ChatId) -> Op = { chatIdColumn.eq(it.chatId) } @@ -50,7 +54,8 @@ class CaptchaChatsSettingsRepo( get() = ChatSettings( get(chatIdColumn).toChatId(), get(checkTimeSecondsColumn), - get(solveCaptchaTextColumn) + get(solveCaptchaTextColumn), + get(autoRemoveCommandsColumn) ) init { diff --git a/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/settings/ChatSettings.kt b/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/settings/ChatSettings.kt index 69d1334..a46ac09 100644 --- a/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/settings/ChatSettings.kt +++ b/src/main/kotlin/dev/inmo/plagubot/plugins/captcha/settings/ChatSettings.kt @@ -10,7 +10,8 @@ import kotlinx.serialization.Transient data class ChatSettings( val chatId: ChatId, val checkTime: Seconds = 60, - val captchaText: String = "solve next captcha:" + val captchaText: String = "solve next captcha:", + val autoRemoveCommands: Boolean = false ) { @Transient val checkTimeSpan = TimeSpan(checkTime * 1000.0)