Merge pull request #1 from InsanusMokrassar/0.1.4

0.1.4
This commit is contained in:
InsanusMokrassar 2021-03-17 22:06:08 +06:00 committed by GitHub
commit 8f25f8233e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 130 additions and 34 deletions

View File

@ -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

27
.github/workflows/publish_package.yml vendored Normal file
View File

@ -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 }}

View File

@ -17,12 +17,22 @@ plugins {
apply from: "./publish.gradle" apply from: "./publish.gradle"
project.group = "$project_group" project.group = "$project_group"
project.version = "$plagubot_version" project.version = "$project_version"
repositories { repositories {
mavenLocal() mavenLocal()
mavenCentral() mavenCentral()
jcenter() 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 { dependencies {
@ -32,4 +42,5 @@ dependencies {
api "dev.inmo:plagubot.plugin:$plagubot_version" api "dev.inmo:plagubot.plugin:$plagubot_version"
api "dev.inmo:micro_utils.repos.exposed:$micro_utils_version" api "dev.inmo:micro_utils.repos.exposed:$micro_utils_version"
api "dev.inmo:tgbotapi.libraries.cache.admins.plagubot:$tgbotapi_libraries_version"
} }

View File

@ -4,11 +4,13 @@ org.gradle.parallel=true
kotlin.js.generate.externals=true kotlin.js.generate.externals=true
kotlin.incremental=true kotlin.incremental=true
kotlin_version=1.4.30 kotlin_version=1.4.31
kotlin_coroutines_version=1.4.2 kotlin_coroutines_version=1.4.3
kotlin_serialisation_runtime_version=1.1.0-RC kotlin_serialisation_runtime_version=1.1.0
plagubot_version=0.1.3 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_group=dev.inmo
project_version=0.1.4

View File

@ -51,6 +51,17 @@ publishing {
} }
} }
repositories { repositories {
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 { maven {
name = "sonatype" name = "sonatype"
url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/") url = uri("https://oss.sonatype.org/service/local/staging/deploy/maven2/")
@ -62,6 +73,7 @@ publishing {
} }
} }
} }
}
} }
signing { signing {

View File

@ -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"} {"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"}

View File

@ -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.*
import dev.inmo.tgbotapi.extensions.behaviour_builder.expectations.waitBaseInlineQuery 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.expectations.waitDataCallbackQuery
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onCommand
import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter import dev.inmo.tgbotapi.updateshandlers.FlowsUpdatesFilter
import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onNewChatMembers import dev.inmo.tgbotapi.extensions.behaviour_builder.triggers_handling.onNewChatMembers
import dev.inmo.tgbotapi.extensions.utils.* import dev.inmo.tgbotapi.extensions.utils.*
import dev.inmo.tgbotapi.extensions.utils.formatting.buildEntities import dev.inmo.tgbotapi.extensions.utils.formatting.buildEntities
import dev.inmo.tgbotapi.extensions.utils.formatting.regular import dev.inmo.tgbotapi.extensions.utils.formatting.regular
import dev.inmo.tgbotapi.extensions.utils.shortcuts.executeUnsafe 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.requests.DeleteMessage
import dev.inmo.tgbotapi.types.BotCommand
import dev.inmo.tgbotapi.types.MessageEntity.textsources.mention import dev.inmo.tgbotapi.types.MessageEntity.textsources.mention
import dev.inmo.tgbotapi.types.User import dev.inmo.tgbotapi.types.User
import dev.inmo.tgbotapi.types.chat.ChatPermissions import dev.inmo.tgbotapi.types.chat.ChatPermissions
import dev.inmo.tgbotapi.types.chat.LeftRestrictionsChatPermissions 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.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.*
import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.channels.toList import kotlinx.coroutines.channels.toList
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import org.jetbrains.exposed.sql.Database 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 @Serializable
class CaptchaBotPlugin : Plugin { class CaptchaBotPlugin : Plugin {
override suspend fun getCommands(): List<BotCommand> = 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( override suspend fun BehaviourContext.invoke(
database: Database, database: Database,
params: Map<String, Any> params: Map<String, Any>
) { ) {
val repo = CaptchaChatsSettingsRepo(database) val repo = CaptchaChatsSettingsRepo(database)
val adminsAPI = params.adminsPlugin ?.adminsAPI(database)
suspend fun Chat.settings() = repo.getById(id) ?: repo.create(ChatSettings(id)).first()
onNewChatMembers( onNewChatMembers(
additionalFilter = { additionalFilter = {
it.chat.asPublicChat() != null it.chat.asPublicChat() != null
@ -59,7 +82,7 @@ class CaptchaBotPlugin : Plugin {
permissions = ChatPermissions() 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 userBanDateTime = eventDateTime + settings.checkTimeSpan
val authorized = Channel<User>(newUsers.size) val authorized = Channel<User>(newUsers.size)
val messagesToDelete = Channel<Message>(Channel.UNLIMITED) val messagesToDelete = Channel<Message>(Channel.UNLIMITED)
@ -128,5 +151,36 @@ class CaptchaBotPlugin : Plugin {
executeUnsafe(DeleteMessage(message.chat.id, message.messageId), retries = 0) 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)
)
}
}
}
} }
} }

View File

@ -17,6 +17,7 @@ class CaptchaChatsSettingsRepo(
private val chatIdColumn = long("chatId") private val chatIdColumn = long("chatId")
private val checkTimeSecondsColumn = integer("checkTime") private val checkTimeSecondsColumn = integer("checkTime")
private val solveCaptchaTextColumn = text("solveCaptchaText") private val solveCaptchaTextColumn = text("solveCaptchaText")
private val autoRemoveCommandsColumn = bool("autoRemoveCommands")
override val primaryKey = PrimaryKey(chatIdColumn) override val primaryKey = PrimaryKey(chatIdColumn)
@ -30,19 +31,22 @@ class CaptchaChatsSettingsRepo(
it[chatIdColumn] = value.chatId.chatId it[chatIdColumn] = value.chatId.chatId
it[checkTimeSecondsColumn] = value.checkTime it[checkTimeSecondsColumn] = value.checkTime
it[solveCaptchaTextColumn] = value.captchaText it[solveCaptchaTextColumn] = value.captchaText
it[autoRemoveCommandsColumn] = value.autoRemoveCommands
} }
override fun update(id: ChatId, value: ChatSettings, it: UpdateStatement) { override fun update(id: ChatId, value: ChatSettings, it: UpdateStatement) {
if (id.chatId == value.chatId.chatId) { if (id.chatId == value.chatId.chatId) {
it[checkTimeSecondsColumn] = value.checkTime it[checkTimeSecondsColumn] = value.checkTime
it[solveCaptchaTextColumn] = value.captchaText it[solveCaptchaTextColumn] = value.captchaText
it[autoRemoveCommandsColumn] = value.autoRemoveCommands
} }
} }
override fun InsertStatement<Number>.asObject(value: ChatSettings): ChatSettings = ChatSettings( override fun InsertStatement<Number>.asObject(value: ChatSettings): ChatSettings = ChatSettings(
get(chatIdColumn).toChatId(), get(chatIdColumn).toChatId(),
get(checkTimeSecondsColumn), get(checkTimeSecondsColumn),
get(solveCaptchaTextColumn) get(solveCaptchaTextColumn),
get(autoRemoveCommandsColumn)
) )
override val selectById: SqlExpressionBuilder.(ChatId) -> Op<Boolean> = { chatIdColumn.eq(it.chatId) } override val selectById: SqlExpressionBuilder.(ChatId) -> Op<Boolean> = { chatIdColumn.eq(it.chatId) }
@ -50,7 +54,8 @@ class CaptchaChatsSettingsRepo(
get() = ChatSettings( get() = ChatSettings(
get(chatIdColumn).toChatId(), get(chatIdColumn).toChatId(),
get(checkTimeSecondsColumn), get(checkTimeSecondsColumn),
get(solveCaptchaTextColumn) get(solveCaptchaTextColumn),
get(autoRemoveCommandsColumn)
) )
init { init {

View File

@ -10,7 +10,8 @@ import kotlinx.serialization.Transient
data class ChatSettings( data class ChatSettings(
val chatId: ChatId, val chatId: ChatId,
val checkTime: Seconds = 60, val checkTime: Seconds = 60,
val captchaText: String = "solve next captcha:" val captchaText: String = "solve next captcha:",
val autoRemoveCommands: Boolean = false
) { ) {
@Transient @Transient
val checkTimeSpan = TimeSpan(checkTime * 1000.0) val checkTimeSpan = TimeSpan(checkTime * 1000.0)