feat: 初步支持创建实例的功能.

This commit is contained in:
LamGC 2022-08-09 19:19:16 +08:00
parent 995b4032a6
commit cc3edd8eb9
Signed by: LamGC
GPG Key ID: 6C5AE2A913941E1D
3 changed files with 2015 additions and 7 deletions

File diff suppressed because it is too large Load Diff

View File

@ -55,6 +55,9 @@ class OracleServerExtension(private val bot: BaseAbilityBot) : AbilityExtension
}
keyboardBuilder.rowButton {
text("*** 创建新的服务器实例 ***")
callbackData(upd.callbackQuery.callbackData.next("oc_instance_create_menu"))
}.rowButton {
text("<<< 返回上一级")
callbackData(upd.callbackQuery.callbackData.next("oc_account_manager"))
}
@ -635,6 +638,8 @@ class OracleServerExtension(private val bot: BaseAbilityBot) : AbilityExtension
return@callbackQueryOf
}
// TODO: 增加一个 创建保留 IP 的操作。
val keyboardBuilder = InlineKeyboardGroupBuilder()
for (publicIp in publicIps) {
keyboardBuilder.rowButton {

View File

@ -26,8 +26,11 @@ import org.telegram.abilitybots.api.sender.MessageSender
import org.telegram.abilitybots.api.sender.SilentSender
import org.telegram.telegrambots.meta.api.methods.BotApiMethod
import org.telegram.telegrambots.meta.api.methods.GetFile
import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageReplyMarkup
import org.telegram.telegrambots.meta.api.methods.updatingmessages.EditMessageText
import org.telegram.telegrambots.meta.api.objects.CallbackQuery
import org.telegram.telegrambots.meta.api.objects.Update
import org.telegram.telegrambots.meta.api.objects.User
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup
import org.telegram.telegrambots.meta.api.objects.replykeyboard.InlineKeyboardMarkup.InlineKeyboardMarkupBuilder
import org.telegram.telegrambots.meta.api.objects.replykeyboard.buttons.InlineKeyboardButton
@ -190,6 +193,7 @@ class InlineKeyboardGroupBuilder {
fun build(): InlineKeyboardMarkup = builder.build()
}
@Suppress("MemberVisibilityCanBePrivate")
class InlineKeyboardRowBuilder(private val groupBuilder: InlineKeyboardGroupBuilder) {
private val row = mutableListOf<InlineKeyboardButton>()
@ -212,7 +216,9 @@ class InlineKeyboardRowBuilder(private val groupBuilder: InlineKeyboardGroupBuil
}
fun then(): InlineKeyboardGroupBuilder {
groupBuilder.addRow(row)
if (row.isNotEmpty()) {
groupBuilder.addRow(row)
}
return groupBuilder
}
@ -225,9 +231,16 @@ class InlineKeyboardRowBuilder(private val groupBuilder: InlineKeyboardGroupBuil
}
}
fun InlineKeyboardGroupBuilder.addBackButton(callback: InlineKeyboardCallback): InlineKeyboardGroupBuilder {
fun InlineKeyboardButtonBuilder.emptyData() {
callbackData("""{"__EMPTY__": null}""")
}
fun InlineKeyboardGroupBuilder.addBackButton(
callback: InlineKeyboardCallback,
message: String = "<<< 返回上一级",
): InlineKeyboardGroupBuilder {
rowButton {
text("<<< 返回上一级")
text(message)
callbackData(callback)
}
return this
@ -307,15 +320,15 @@ fun createPromptKeyboard(
.build()
}
fun <T : java.io.Serializable, Method : BotApiMethod<T>, Sender : AbsSender> Method.execute(sender: Sender): T {
fun <T : java.io.Serializable, Method : BotApiMethod<T>> Method.execute(sender: AbsSender): T {
return sender.execute(this)
}
fun <T : java.io.Serializable, Method : BotApiMethod<T>, Sender : MessageSender> Method.execute(sender: Sender): T {
fun <T : java.io.Serializable, Method : BotApiMethod<T>> Method.execute(sender: MessageSender): T {
return sender.execute(this)
}
fun <T : java.io.Serializable, Method : BotApiMethod<T>, Sender : SilentSender> Method.execute(sender: Sender): Optional<T>? {
fun <T : java.io.Serializable, Method : BotApiMethod<T>> Method.execute(sender: SilentSender): Optional<T>? {
return sender.execute(this)
}
@ -391,7 +404,7 @@ fun Random.randomString(length: Int): String {
fun callbackQueryOf(
action: String,
checkProfileOwner: Boolean = true,
block: (BaseAbilityBot, Update) -> Unit
block: (BaseAbilityBot, Update) -> Unit,
): Reply {
return Reply.of(block, mutableListOf<Predicate<Update>?>().apply {
add(callbackQueryAt(action))
@ -401,6 +414,35 @@ fun callbackQueryOf(
}.toList())
}
fun callbackQueryHandleOf(
action: String,
extraCondition: List<Predicate<Update>> = emptyList(),
checkProfileOwner: Boolean = true,
block: CallbackQueryHandler.() -> Unit,
): Reply {
return Reply.of({ bot, upd ->
CallbackQueryHandler(bot, upd).block()
}, mutableListOf<Predicate<Update>?>().apply {
add(callbackQueryAt(action))
addAll(extraCondition)
if (checkProfileOwner) {
add(checkCallbackQueryIsProfileOwner())
}
}.toList())
}
class CallbackQueryHandler(val bot: BaseAbilityBot, val upd: Update) {
val callbackData: InlineKeyboardCallback
get() = upd.callbackQuery.callbackData
val chatId: Long
get() = upd.callbackQuery.message.chatId
val user: User
get() = upd.callbackQuery.from
}
fun getProfileByCallback(callback: InlineKeyboardCallback): OracleAccountProfile {
return OracleAccountProfile.fromJson(callback.extraData[JsonFields.AccountProfile].asJsonObject)
}
@ -446,6 +488,49 @@ fun jsonObjectOf(jsonObject: JsonObject = JsonObject(), block: JsonObjectBuilder
}
object JsonFields {
/**
* 子网显示名称.
* 类型为 [String]
*/
const val SubnetDisplayName = "subnet_display_name"
/**
* 镜像 Id.
* 类型为 [String]
*/
const val ImageId = "image_id"
/**
* 镜像显示名称.
* 类型为 [String]
*/
const val ImageDisplayName = "image_display_name"
/**
* 灵活规格的 CPU 数量.
* 类型为 [Float]
*/
const val ShapeCpus = "shape_cpus"
/**
* 灵活规格的内存数量.
* 类型为 [Float]
*/
const val ShapeMemories = "shape_memories"
/**
* 实例规格 Id.
* 类型为 [String]
*/
const val ShapeId = "shape_id"
/**
* 实例规格.
* 类型为 [JsonObject] -> [Shape]
*/
const val Shape = "shape"
/**
* [OracleAccountProfile] 字段
* 类型为 [JsonObject]
@ -476,6 +561,12 @@ object JsonFields {
*/
const val SubnetId = "subnet_id"
/**
* 子网可用域.
* 类型为 [String]
*/
const val Subnet_AvailabilityDomain = "subnet_availability_domain"
/**
* 子网中的公网 IPv4 Id 列表.
* 类型为 List<String>
@ -512,4 +603,118 @@ object JsonFields {
*/
const val VnicId = "vnic_id"
/**
* 引导卷 Id 列表.
* 类型为 [Array<String>]
*/
const val BootVolumeIds = "bootvolume_id_list"
/**
* 引导卷 Id.
* 类型为 [String]
*/
const val BootVolumeId = "bootvolume_id"
/**
* 引导卷名称.
* 类型为 [String]
*/
const val BootVolumeDisplayName = "bootvolume_display_name"
/**
* 引导卷 Id.
* 类型为 [com.oracle.bmc.core.model.BootVolume]
*/
const val BootVolume = "bootvolume"
/**
* 实例创建参数.
* 类型为 [CreateInstanceOptions]
*/
const val CreateInstanceOptions = "create_instance_options"
/**
* 可用域 Id.
* 类型为 [String]
*/
const val AvailabilityDomainId = "availability_domain_id"
/**
* 可用域名称.
* 类型为 [String]
*/
const val AvailabilityDomainName = "availability_domain_name"
/**
* 容错域 Id.
* 类型为 [String]
*/
const val FaultDomainId = "fault_domain_id"
/**
* 容错域名称.
* 类型为 [String]
*/
const val FaultDomainName = "fault_domain_name"
/**
* 当前页码.
* 类型为 [Int]
*/
const val CurrentPageNumber = "current_page_number"
/**
* 下一页的页码.
* 类型为 [String]
*/
const val NextPageNumber = "next_page_number"
/**
* 上一页的页码.
* 类型为 [String]
*/
const val PrevPage = "prev_page_number"
/**
* 目标页码.
* 类型为 [String]
*/
const val JumpToPage = "jump_to_page"
}
fun EditMessageText.EditMessageTextBuilder.replyTo(callbackQuery: CallbackQuery): EditMessageText.EditMessageTextBuilder {
chatId(callbackQuery.message.chatId.toString())
messageId(callbackQuery.message.messageId)
return this
}
fun EditMessageReplyMarkup.EditMessageReplyMarkupBuilder.replyTo(callbackQuery: CallbackQuery)
: EditMessageReplyMarkup.EditMessageReplyMarkupBuilder {
chatId(callbackQuery.message.chatId.toString())
messageId(callbackQuery.message.messageId)
return this
}
class MapBuilder<K, V>(val map: MutableMap<K, V>) {
infix fun K.set(value: V?) {
if (value == null) {
map.remove(this)
return
}
map[this] = value
}
infix fun MapBuilder<K, V>.delete(key: K) {
map.remove(key)
}
infix fun MutableMap<K, V>.delete(key: K) {
map.remove(key)
}
}
fun <K, V> mapOf(map: MutableMap<K, V> = mutableMapOf(), block: MapBuilder<K, V>.() -> Unit): Map<K, V> {
MapBuilder(map).apply(block)
return map.toMap()
}