Skip to content

Commit

Permalink
Refinds
Browse files Browse the repository at this point in the history
  • Loading branch information
nekohasekai committed Sep 17, 2020
1 parent 5112291 commit 58e067f
Show file tree
Hide file tree
Showing 29 changed files with 180 additions and 210 deletions.
6 changes: 1 addition & 5 deletions _pm.yml
Expand Up @@ -3,8 +3,4 @@ BOT_LANG: zh_CN
B0T_OWNER:
PM_MODE: private
PM_WHITE_LIST:
LOG_LEVEL: INFO
BOT_LANG_LIST:
- en_US
- zh_CN
- zh_TW
LOG_LEVEL: INFO
12 changes: 11 additions & 1 deletion bot/src/main/java/io/nekohasekai/pm/IdDefs.kt
@@ -1,5 +1,8 @@
package io.nekohasekai.pm

import io.nekohasekai.ktlib.td.core.TdHandler
import io.nekohasekai.pm.instance.PmBot

const val PERSIST_BOT_CREATE = 0
const val PERSIST_SET_START_MESSAGES = 2
const val PERSIST_NEW_FUNCTION = 3
Expand All @@ -15,4 +18,11 @@ const val DATA_DELETE_BOT_MENU = 5L
const val DATA_DELETE_MESSAGE = 6L
const val DATA_EDIT_OPTIONS = 7L
const val DATA_EDIT_COMMANDS = 8L
const val DATA_EDIT_COMMAND = 9L
const val DATA_EDIT_COMMAND = 9L

val TdHandler.launcher
get() = when (val sudo = sudo) {
is Launcher -> sudo
is PmBot -> sudo.launcher
else -> error("invalid handler")
}
104 changes: 69 additions & 35 deletions bot/src/main/java/io/nekohasekai/pm/Launcher.kt
Expand Up @@ -5,6 +5,7 @@ import cn.hutool.core.date.SystemClock
import cn.hutool.core.io.FileUtil
import io.nekohasekai.ktlib.compress.*
import io.nekohasekai.ktlib.core.*
import io.nekohasekai.ktlib.db.IdTableCacheMap
import io.nekohasekai.ktlib.td.cli.TdCli
import io.nekohasekai.ktlib.td.core.extensions.*
import io.nekohasekai.ktlib.td.core.i18n.*
Expand All @@ -24,7 +25,9 @@ import java.util.*
import kotlin.concurrent.schedule
import kotlin.system.exitProcess

object Launcher : TdCli(), PmInstance {
class Launcher(val id: String = "TdPM") : TdCli(), PmInstance {

val log = mkLog(id)

var public = false
lateinit var whiteList: IntArray
Expand All @@ -48,24 +51,56 @@ object Launcher : TdCli(), PmInstance {

lateinit var users: Array<Long>

override val integration get() = BotIntegration.Cache.fetch(me.id).value
override val settings get() = BotSetting.Cache.fetch(me.id).value
override val blocks by lazy { UserBlocks.Cache(me.id) }
val botIntegrations by lazy { IdTableCacheMap(database, BotIntegration) }
val botSettings by lazy { IdTableCacheMap(database, BotSetting) }
val actionMessages by lazy { IdTableCacheMap(database, ActionMessage) }
val startMessages by lazy { StartMessages.Cache(database) }
val botCommands by lazy { BotCommands.Cache(database) }

override val integration get() = botIntegrations.fetch(me.id).value
override val settings get() = botSettings.fetch(me.id).value
override val blocks by lazy { UserBlocks.Cache(database, me.id) }

val instanceMap = HashMap<Int, PmBot>()

fun initBot(userBot: UserBot): PmBot {

return instanceMap[userBot.botId] ?: synchronized(instanceMap) {

PmBot(userBot.botToken, userBot, this).apply {

instanceMap[botUserId] = this

start()

}

}

}

override var configFile = File("pm.yml")

@JvmStatic
fun main(args: Array<String>) {
companion object {

const val repoName = "TdPmBot"
const val repoUrl = "https://github.com/TdBotProject/TdPmBot"
const val licenseUrl = "https://github.com/TdBotProject/TdPmBot/blob/master/LICENSE"

launch(args)
@JvmStatic
fun main(args: Array<String>) = with(Launcher()) {

loadConfig()
launch(args)

start()
loadConfig()

if (admin == 0L) {
start()

defaultLog.warn("Bot owner not specified, send /id to bot to get your userId.")
if (admin == 0L) {

log.warn("Bot owner not specified, send /id to bot to get your userId.")

}

}

Expand Down Expand Up @@ -95,7 +130,7 @@ object Launcher : TdCli(), PmInstance {

runCatching { item.toInt() }.onFailure {

defaultLog.warn(">> Invalid white-list user-id item: $item", it)
log.warn(">> Invalid white-list user-id item: $item", it)

}.getOrNull()

Expand All @@ -111,7 +146,7 @@ object Launcher : TdCli(), PmInstance {

else -> {

defaultLog.error(">> Invalid mode defined: $pmMode")
log.error(">> Invalid mode defined: $pmMode")

exitProcess(100)

Expand All @@ -136,7 +171,7 @@ object Launcher : TdCli(), PmInstance {

} else if (!backupTo.name.endsWith(".tar.xz")) {

defaultLog.error(">> File name must ends with .tar.xz")
log.error(">> File name must ends with .tar.xz")

exitProcess(100)

Expand Down Expand Up @@ -178,7 +213,7 @@ object Launcher : TdCli(), PmInstance {

output.close()

defaultLog.info(">> Saved to ${backupTo.path}")
log.info(">> Saved to ${backupTo.path}")

exitProcess(0)

Expand All @@ -190,7 +225,7 @@ object Launcher : TdCli(), PmInstance {

super.onLoad()

defaultLog.debug("Init databases")
log.debug("Init databases")

initDatabase("pm_data.db")

Expand Down Expand Up @@ -276,7 +311,9 @@ object Launcher : TdCli(), PmInstance {

database {

BotInstances.loadAll()
log.trace("Loading PM Bots")

UserBot.all().forEach { initBot(it) }

}

Expand All @@ -290,18 +327,19 @@ object Launcher : TdCli(), PmInstance {

override suspend fun gc() {

defaultLog.debug(">> 执行垃圾回收")
log.debug(">> 执行垃圾回收")

defaultLog.debug(">> 内存缓存")
log.debug(">> 内存缓存")

super.gc()

BotIntegration.Cache.clear()
BotSetting.Cache.clear()
ActionMessage.Cache.clear()
StartMessages.Cache.clear()
botIntegrations.gc()
botSettings.gc()
actionMessages.gc()
startMessages.gc()
botCommands.gc()

defaultLog.debug(">> 清理数据库")
log.debug(">> 清理数据库")

val time = (SystemClock.now() / 1000L).toInt() - 24 * 60 * 60

Expand Down Expand Up @@ -338,26 +376,22 @@ object Launcher : TdCli(), PmInstance {

}

defaultLog.trace(">> ${me.displayNameFormatted}")
log.trace(">> ${me.displayNameFormatted}")

gc(this)

BotInstances.instanceMap.forEach {
instanceMap.forEach {

defaultLog.trace(">> ${it.value.me.displayNameFormatted}")
log.trace(">> ${it.value.me.displayNameFormatted}")

it.value.gc()

}

defaultLog.debug("<< 执行垃圾回收")
log.debug("<< 执行垃圾回收")

}

const val repoName = "TdPmBot"
const val repoUrl = "https://github.com/TdBotProject/TdPmBot"
const val licenseUrl = "https://github.com/TdBotProject/TdPmBot/blob/master/LICENSE"

override suspend fun userBlocked(userId: Int) = blocks.fetch(userId).value == true

override suspend fun onUndefinedFunction(userId: Int, chatId: Long, message: TdApi.Message, function: String, param: String, params: Array<String>, originParams: Array<String>) {
Expand All @@ -372,7 +406,7 @@ object Launcher : TdCli(), PmInstance {

}

val command = BotCommands.Cache.fetch(me.id to function).value?.takeIf { !it.hide }
val command = botCommands.fetch(me.id to function).value?.takeIf { !it.hide }

if (message.fromPrivate) {

Expand Down Expand Up @@ -405,7 +439,7 @@ object Launcher : TdCli(), PmInstance {

if (message.fromPrivate) {

val command = BotCommands.Cache.fetch(me.id to payload).value?.takeIf { !it.hide } ?: rejectFunction()
val command = botCommands.fetch(me.id to payload).value?.takeIf { !it.hide } ?: rejectFunction()

command.messages.forEach { sudo make it syncTo chatId }

Expand All @@ -421,7 +455,7 @@ object Launcher : TdCli(), PmInstance {

val L = localeFor(userId)

val startMessages = StartMessages.Cache.fetch(me.id).value
val startMessages = startMessages.fetch(me.id).value

if (!public && chatId != admin) {

Expand Down
4 changes: 0 additions & 4 deletions bot/src/main/java/io/nekohasekai/pm/database/ActionMessage.kt
@@ -1,7 +1,5 @@
package io.nekohasekai.pm.database

import io.nekohasekai.ktlib.db.IdTableCacheMap
import io.nekohasekai.pm.Launcher
import org.jetbrains.exposed.dao.Entity
import org.jetbrains.exposed.dao.EntityClass
import org.jetbrains.exposed.dao.id.EntityID
Expand All @@ -20,6 +18,4 @@ class ActionMessage(id: EntityID<Int>) : Entity<Int>(id) {

companion object : EntityClass<Int, ActionMessage>(ActionMessages)

object Cache : IdTableCacheMap<Int, ActionMessage>(Launcher.database, ActionMessage)

}
6 changes: 2 additions & 4 deletions bot/src/main/java/io/nekohasekai/pm/database/BotCommands.kt
@@ -1,8 +1,6 @@
package io.nekohasekai.pm.database

import io.nekohasekai.ktlib.db.DatabaseCacheMap
import io.nekohasekai.ktlib.db.kryo
import io.nekohasekai.pm.Launcher
import io.nekohasekai.ktlib.db.*
import org.jetbrains.exposed.sql.*
import td.TdApi
import java.util.*
Expand All @@ -18,7 +16,7 @@ object BotCommands : Table("bot_commands") {

override val primaryKey = PrimaryKey(botId, command)

object Cache : DatabaseCacheMap<Pair<Int, String>, BotCommand>(Launcher.database) {
class Cache(database: DatabaseDispatcher) : DatabaseCacheMap<Pair<Int, String>, BotCommand>(database) {

override fun read(id: Pair<Int, String>): BotCommand? {

Expand Down
@@ -1,7 +1,5 @@
package io.nekohasekai.pm.database

import io.nekohasekai.ktlib.db.IdTableCacheMap
import io.nekohasekai.pm.Launcher
import org.jetbrains.exposed.dao.Entity
import org.jetbrains.exposed.dao.EntityClass
import org.jetbrains.exposed.dao.id.EntityID
Expand All @@ -21,6 +19,5 @@ class BotIntegration(id: EntityID<Int>) : Entity<Int>(id) {

companion object : EntityClass<Int, BotIntegration>(BotIntegrations)

object Cache : IdTableCacheMap<Int, BotIntegration>(Launcher.database, this)

}
4 changes: 0 additions & 4 deletions bot/src/main/java/io/nekohasekai/pm/database/BotSetting.kt
@@ -1,7 +1,5 @@
package io.nekohasekai.pm.database

import io.nekohasekai.ktlib.db.IdTableCacheMap
import io.nekohasekai.pm.Launcher
import org.jetbrains.exposed.dao.Entity
import org.jetbrains.exposed.dao.EntityClass
import org.jetbrains.exposed.dao.id.EntityID
Expand All @@ -22,6 +20,4 @@ class BotSetting(id: EntityID<Int>) : Entity<Int>(id) {

companion object : EntityClass<Int, BotSetting>(BotSettings)

object Cache : IdTableCacheMap<Int, BotSetting>(Launcher.database, this)

}
6 changes: 4 additions & 2 deletions bot/src/main/java/io/nekohasekai/pm/database/PmInstance.kt
Expand Up @@ -11,8 +11,8 @@ import io.nekohasekai.ktlib.td.core.i18n.LocaleController
import io.nekohasekai.ktlib.td.core.i18n.localeFor
import io.nekohasekai.ktlib.td.core.raw.getChat
import io.nekohasekai.ktlib.td.core.raw.getMessageOrNull
import io.nekohasekai.pm.Launcher
import io.nekohasekai.pm.instance.messagesForCurrentBot
import io.nekohasekai.pm.launcher
import org.jetbrains.exposed.sql.*

interface PmInstance {
Expand All @@ -24,7 +24,7 @@ interface PmInstance {

}

val PmInstance.L by receive<PmInstance, LocaleController> { Launcher.localeFor(admin) }
val PmInstance.L by receive<PmInstance, LocaleController> { (this as TdHandler).launcher.localeFor(admin) }

fun TdHandler.saveMessage(type: Int, chatId: Long, messageId: Long, targetId: Long? = null) {

Expand Down Expand Up @@ -52,6 +52,8 @@ fun TdHandler.saveMessage(type: Int, chatId: Long, messageId: Long, targetId: Lo

suspend fun TdHandler.gc(instance: PmInstance) {

instance.blocks.gc()

var deleted = 0

val integration = instance.integration
Expand Down
11 changes: 3 additions & 8 deletions bot/src/main/java/io/nekohasekai/pm/database/StartMessages.kt
@@ -1,12 +1,7 @@
package io.nekohasekai.pm.database

import io.nekohasekai.ktlib.db.DatabaseCacheMap
import io.nekohasekai.ktlib.db.kryo
import io.nekohasekai.ktlib.db.upsert
import io.nekohasekai.pm.Launcher
import org.jetbrains.exposed.sql.Table
import org.jetbrains.exposed.sql.deleteWhere
import org.jetbrains.exposed.sql.select
import io.nekohasekai.ktlib.db.*
import org.jetbrains.exposed.sql.*
import td.TdApi
import java.util.*

Expand All @@ -16,7 +11,7 @@ object StartMessages : Table("pm_start_messages") {

val messages = kryo<LinkedList<TdApi.InputMessageContent>>("messages")

object Cache : DatabaseCacheMap<Int, LinkedList<TdApi.InputMessageContent>>(Launcher.database) {
class Cache(database: DatabaseDispatcher) : DatabaseCacheMap<Int, LinkedList<TdApi.InputMessageContent>>(database) {

override fun read(id: Int): LinkedList<TdApi.InputMessageContent>? {

Expand Down

0 comments on commit 58e067f

Please sign in to comment.