UNPKG

koishi-plugin-card-21-game

Version:

Koishi 的 21 点(黑杰克)纸牌游戏插件。完整赌场规则。

1,803 lines (1,767 loc) 135 kB
var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); var __export = (target, all) => { for (var name2 in all) __defProp(target, name2, { get: all[name2], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { Config: () => Config, apply: () => apply, inject: () => inject, name: () => name, usage: () => usage }); module.exports = __toCommonJS(src_exports); var import_koishi = require("koishi"); var inject = { required: ["monetary", "database"], optional: ["markdownToImage"] }; var name = "card-21-game"; var usage = `## 使用 1. 启动 \`monetary\` 和 \`database\` 服务。 2. 设置指令别名。 3. 投注:\`blackjack.加入游戏 [投注]\`。 4. 开始: - 有庄家模式:\`blackjack.开始游戏\`。 - 无庄家模式:\`blackjack.开始游戏 -n\`。 - 筹码为通用货币,通过其他插件(签到、钓鱼、赛马等)获得。 - 文本转图片:推荐 \`imagify\` 插件,视觉效果更佳。 ## 规则 - 无庄家模式:玩家之间进行游戏。 - 有庄家模式:庄家与玩家对战,庄家为机器人。 - 游戏目标:使手牌点数尽量接近 21 点,但不超过 21 点。 ## 术语 - 投降:玩家未要牌前可投降,返还半注。 - 黑杰克:手牌点数 21 点,且只有两张手牌。赔率为 1.5。 - 加倍:玩家持两张手牌且点数为 11 时,可加倍投注,只能再要一张牌。 - 保险:庄家的第一张牌是 A 时,玩家可将筹码分半,购买保险。庄家手牌 21 点时,获双倍保险金。 - 分牌:玩家手牌为对子时,可分两副手牌,分别进行操作,若分出的是 A,只能再要一张牌。 ## QQ 群 - 956758505`; var Config = import_koishi.Schema.intersect([ import_koishi.Schema.object({ allowZeroBetJoin: import_koishi.Schema.boolean().default(true).description(`是否开启零投注也能加入游戏的功能。`), enableCardBetting: import_koishi.Schema.boolean().default(false).description(`是否开启投注牌型功能。`), enableSurrender: import_koishi.Schema.boolean().default(false).description(`是否开启投降功能。`) }).description("一般设置"), import_koishi.Schema.object({ retractDelay: import_koishi.Schema.number().min(0).default(0).description( `自动撤回等待的时间,单位是秒。值为 0 时不启用自动撤回功能。` ), imageType: import_koishi.Schema.union(["png", "jpeg", "webp"]).default("png").description(`发送的图片类型。`), isTextToImageConversionEnabled: import_koishi.Schema.boolean().default(false).description( `(QQ 官方机器人必须开启,防违规检测)是否开启将文本转为图片的功能(可选),如需启用,需要启用 \`markdownToImage\` 服务。` ), isEnableQQOfficialRobotMarkdownTemplate: import_koishi.Schema.boolean().default(false).description( `(QQ 官方机器人必须开启文本转图片功能,用于防违规检测)是否启用 QQ 官方机器人的 Markdown 模板,带消息按钮。` ) }).description("消息处理设置"), import_koishi.Schema.union([ import_koishi.Schema.object({ isEnableQQOfficialRobotMarkdownTemplate: import_koishi.Schema.const(true).required(), customTemplateId: import_koishi.Schema.string().default("").description(`自定义模板 ID。`), key: import_koishi.Schema.string().default("").description( `文本内容中特定插值的 key。如果你的插值为 {{.info}},那么请在这里填 info。` ), // key2: Schema.string().default('').description(`发送图片信息的特定插值的 key,用于存放图片的宽高。与下面的 key3 联动,Markdown 源码中形如:{{.key2}}{{.key3}},那么该配置项就填 key2,下面的就填 key3。`), // key3: Schema.string().default('').description(`发送图片URL的特定插值的 key,用于存放图片的URL。`), numberOfMessageButtonsPerRow: import_koishi.Schema.number().min(1).max(5).default(2).description(`每行消息按钮的数量。`) }), import_koishi.Schema.object({}) ]), import_koishi.Schema.object({ defaultMaxLeaderboardEntries: import_koishi.Schema.number().min(0).default(10).description(`显示排行榜时默认的最大人数。`) }).description("排行榜设置"), import_koishi.Schema.object({ minimumRequiredCurrencyForGameEntry: import_koishi.Schema.number().min(0).default(0).description(`加入游戏所需的最低货币数量。`), dealerSpeed: import_koishi.Schema.number().min(0).default(2).description(`庄家要牌的速度,单位是秒。`), betMaxDuration: import_koishi.Schema.number().min(0).default(30).description(`投注牌型操作的等待时长,单位是秒。`), buyInsuranceMaxDuration: import_koishi.Schema.number().min(0).default(10).description(`买保险操作的等待时长,单位是秒。`), surrenderMaxDuration: import_koishi.Schema.number().min(0).default(10).description(`投降操作的等待时长,单位是秒。`), joinGameProcedureWaitTimeInSeconds: import_koishi.Schema.number().min(0).default(2).description(`办理加入游戏手续等待时间,单位是秒。`) }).description("游戏操作设置"), import_koishi.Schema.object({ numberOfDecks: import_koishi.Schema.number().min(1).max(8).default(4).description( `使用几副扑克牌,默认为 4 副(因为闲家都是明牌,所以建议使用默认值)。` ) }).description("扑克牌设置"), import_koishi.Schema.object({ transferFeeRate: import_koishi.Schema.number().default(0.1).description(`转账收取的手续费比例。`), isBellaPluginPointsEnabledForCurrency: import_koishi.Schema.boolean().default(false).description(`是否启用 Bella 签到插件的积分作为货币。`) }).description("费用设置") ]); var initialDeck = [ "♥️A", "♥️2", "♥️3", "♥️4", "♥️5", "♥️6", "♥️7", "♥️8", "♥️9", "♥️10", "♥️J", "♥️Q", "♥️K", "♦️A", "♦️2", "♦️3", "♦️4", "♦️5", "♦️6", "♦️7", "♦️8", "♦️9", "♦️10", "♦️J", "♦️Q", "♦️K", "♣️A", "♣️2", "♣️3", "♣️4", "♣️5", "♣️6", "♣️7", "♣️8", "♣️9", "♣️10", "♣️J", "♣️Q", "♣️K", "♠️A", "♠️2", "♠️3", "♠️4", "♠️5", "♠️6", "♠️7", "♠️8", "♠️9", "♠️10", "♠️J", "♠️Q", "♠️K" ]; function apply(ctx, config) { const { allowZeroBetJoin, isTextToImageConversionEnabled, betMaxDuration, buyInsuranceMaxDuration, surrenderMaxDuration, numberOfDecks, defaultMaxLeaderboardEntries, dealerSpeed, enableCardBetting, enableSurrender, joinGameProcedureWaitTimeInSeconds, transferFeeRate } = config; ctx.model.extend( "blackjack_game_record", { id: "unsigned", channelId: "string", deck: "list", bankerHand: "list", currentPlayerIndex: "integer", currentPlayerUserId: "string", currentPlayerUserName: "string", currentPlayerHandIndex: "integer", gameStatus: "string", canSurrender: "boolean", canBuyInsurance: "boolean", isNoDealerMode: "boolean" }, { primary: "id", autoInc: true } ); ctx.model.extend( "blackjack_playing_record", { id: "unsigned", channelId: "string", userId: "string", username: "string", bet: "double", playerHand: "list", playerHandIndex: "integer", playerIndex: "integer", betPlayerUserId: "string", betPlayerUserName: "string", betType: "string", betAmount: "double", isBuyInsurance: "boolean", insurance: "double", isSurrender: "boolean", isOver: "boolean", win: "double", betWin: "double", afterDoublingTheBet: "string" }, { primary: "id", autoInc: true } ); ctx.model.extend( "blackjack_player_record", { id: "unsigned", userId: "string", username: "string", win: "unsigned", moneyChange: "double", lose: "unsigned", numberOf21: "unsigned", numberOfBlackJack: "unsigned", draw: "unsigned" }, { primary: "id", autoInc: true } ); ctx.command("blackJack", "blackJack/21点游戏帮助").userFields(["id", "name", "permissions"]).action(async ({ session }) => { if (config.isEnableQQOfficialRobotMarkdownTemplate && session.platform === "qq" && config.key !== "" && config.customTemplateId !== "" || session.platform === "qq") { return await sendMessage( session, `🎉 欢迎来到 BlackJack/21 点游戏! 😆 希望你能玩的开心! `, `查询玩家记录 改名 转账 加入游戏 排行榜` ); } await session.execute(`blackjack -h`); }); ctx.command("blackJack.转账 [content:text]", "转账").userFields(["id", "name", "permissions"]).action(async ({ session }, content) => { const sessionUserName = await getSessionUserName(session); if (!content) { let message = ``; if (config.isEnableQQOfficialRobotMarkdownTemplate && session.platform === "qq" && config.key !== "" && config.customTemplateId !== "") { message = `【@${sessionUserName}】 欢迎使用转账功能! 检测到缺少【被转账对象】 请输入:【被转账对象的ID或其修改后的名字】或【取消】 输入示例: > 圣斗士星矢 注意:名字不是 QQ 名或 QQ 号,而是其改名后的名字或其专属ID) `; } else { message = `【@${sessionUserName}】 检测到缺少【被转账对象】! 请选择您的操作:【@被转账对象】或【取消】 【被转账对象】:@被转账人。 输入示例: > @小小学`; } await sendMessage(session, message, `转账`); const userInput = await session.prompt(); if (!userInput) return await sendMessage( session, `【@${sessionUserName}】 输入超时。`, `转账` ); if (userInput === "取消") return await sendMessage( session, `【@${sessionUserName}】 转账操作已取消。`, `转账` ); content = userInput; } content = await replaceAtTags(session, content); const { user, platform } = session; const uid = user.id; let userId = ""; let username = ""; let remainingContent; if (config.isEnableQQOfficialRobotMarkdownTemplate && session.platform === "qq" && config.key !== "" && config.customTemplateId !== "") { const contentArray = content.split(" "); userId = contentArray[0]; username = contentArray[0]; let targetPlayerRecord = []; targetPlayerRecord = await ctx.database.get("blackjack_player_record", { userId }); if (targetPlayerRecord.length === 0) { targetPlayerRecord = await ctx.database.get( "blackjack_player_record", { username } ); if (targetPlayerRecord.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 未找到符合要求的用户 ID。`, `转账` ); } } userId = targetPlayerRecord[0].userId; username = targetPlayerRecord[0].username; remainingContent = contentArray[1]; } else { const userIdRegex = /<at id="(?<userId>[^"]+)"(?: name="(?<username>[^"]+)")?\/>/; const match = content && content.match(userIdRegex); if (!match) { const contentArray = content.split(" "); userId = contentArray[0]; const targetPlayerRecord = await ctx.database.get("blackjack_player_record", { userId }); if (targetPlayerRecord.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 未找到符合要求的用户 ID。`, `转账` ); } else { userId = targetPlayerRecord[0].userId; username = targetPlayerRecord[0].username; remainingContent = contentArray[1]; } } else { userId = match.groups.userId; username = match.groups.username; remainingContent = content.replace(match[0], "").trim(); } } let amount; if (remainingContent.length > 0) { amount = parseFloat(remainingContent); if (Number.isNaN(amount)) { return await sendMessage( session, `【@${sessionUserName}】 转账金额必须是一个有效的数字。`, `转账` ); } if (amount < 0) { return await sendMessage( session, `【@${sessionUserName}】 转账金额不能为负数!`, `转账` ); } } else { return await sendMessage( session, `【@${sessionUserName}】 未找到有效的转账金额。`, `转账` ); } let userMoney = 0; if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get( "bella_sign_in", { id: session.userId } ); if (bellaSignIn.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 转账失败! 您当没有货币记录哦,快去签到吧!`, `转账` ); } userMoney = bellaSignIn[0].point; } else { const getUserMonetary = await ctx.database.get("monetary", { uid }); if (getUserMonetary.length === 0) { await ctx.database.create("monetary", { uid, value: 0, currency: "default" }); return await sendMessage( session, `【@${sessionUserName}】 您还没有货币记录呢~ 无法进行转账操作哦! 不过别担心! 已经为您办理货币登记了呢~`, `转账` ); } const userMonetary = getUserMonetary[0]; userMoney = userMonetary.value; } if (userMoney < amount) { return await sendMessage( session, `【@${sessionUserName}】 检测到您当前的余额不足! 转账金额为:【${amount}】 但您剩余的货币为:【${userMoney}】`, `转账` ); } const transferFee = amount * transferFeeRate; if (userMoney < amount + transferFee) { return await sendMessage( session, `【@${sessionUserName}】 抱歉,转账失败! 余额不足以支付转账所需手续费! 所需手续费为:【${transferFee}】 而转账后您仅剩:【${userMoney - amount - transferFee}】`, `转账` ); } const newScore = userMoney - amount - transferFee; if (config.isBellaPluginPointsEnabledForCurrency) { const targetUser = await ctx.database.get("bella_sign_in", { id: userId }); if (targetUser.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 转账失败! 哎呀,我根本不认识他的说... 或者说...他还没签到过呢!`, `转账` ); } await ctx.database.set( "bella_sign_in", { id: session.userId }, { point: newScore } ); const targetUserPoint = targetUser[0].point; await ctx.database.set( "bella_sign_in", { id: userId }, { point: targetUserPoint + amount } ); } else { const targetUser = await ctx.database.getUser(platform, userId); if (!targetUser) { return await sendMessage( session, `【@${sessionUserName}】 转账失败! 哎呀,我根本不认识他的说...`, `转账` ); } await ctx.database.set("monetary", { uid }, { value: newScore }); const uid2 = targetUser.id; const getUserMonetary2 = await ctx.database.get("monetary", { uid: uid2 }); if (getUserMonetary2.length === 0) { await ctx.database.create("monetary", { uid: uid2, value: amount, currency: "default" }); } else { const userMonetary2 = getUserMonetary2[0]; await ctx.database.set( "monetary", { uid: uid2 }, { value: userMonetary2.value + amount } ); } } await sendMessage( session, `【@${sessionUserName}】 转账成功! 被转账人为:【${username}】 转账金额:【${amount}】 收取手续费:【${transferFee}】 您的余额为:【${newScore}】`, `查询玩家记录 转账 加入游戏` ); }); ctx.command("blackJack.加入游戏 [bet:number]", "加入游戏并投注筹码").userFields(["id", "name", "permissions"]).action(async ({ session }, bet) => { let { channelId, userId, username, user } = session; const uid = user.id; if (!channelId) { channelId = `privateChat_${userId}`; } username = await getSessionUserName(session); const userRecord = await ctx.database.get("blackjack_player_record", { userId }); if (userRecord.length === 0) { await ctx.database.create("blackjack_player_record", { userId, username, win: 0, lose: 0, moneyChange: 0, numberOfBlackJack: 0, numberOf21: 0, draw: 0 }); } else if (username !== userRecord[0].username) { await ctx.database.set( "blackjack_player_record", { userId }, { username } ); } let gameRecord = await ctx.database.get("blackjack_game_record", { channelId }); if (gameRecord.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); gameRecord = await ctx.database.get("blackjack_game_record", { channelId }); } const gameInfo = gameRecord[0]; if (gameInfo.gameStatus !== "未开始") { return await sendMessage( session, `【@${username}】 游戏已经开始了哦~`, `改名 要牌 停牌` ); } const getPlayer = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (getPlayer.length !== 0) { await sendMessage( session, `【@${username}】 您已在游戏中! 您的投注金额为:【${getPlayer[0].bet}】 买定离手,无法再更改投注!`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); return; } if (!bet) { let userMoney2 = 0; if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get("bella_sign_in", { id: session.userId }); if (bellaSignIn.length === 0) { if (!allowZeroBetJoin) { return await sendMessage( session, `【@${username}】 您还没有货币记录哦,快去签到吧!`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } } else { userMoney2 = bellaSignIn[0].point; } } else { let getUserMonetary = await ctx.database.get("monetary", { uid }); if (getUserMonetary.length === 0) { await ctx.database.create("monetary", { uid, value: 0, currency: "default" }); getUserMonetary = await ctx.database.get("monetary", { uid }); if (!allowZeroBetJoin) { return await sendMessage( session, `【@${username}】 您还没有货币记录呢~ 没办法投注的说... 不过别担心! 已经为您办理货币登记了呢~`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } } const userMonetary = getUserMonetary[0]; userMoney2 = userMonetary.value; } const isBalanceSufficient2 = allowZeroBetJoin ? userMoney2 < 0 : userMoney2 <= 0; if (isBalanceSufficient2) { return await sendMessage( session, `【@${username}】 抱歉~ 您没钱啦! 您当前的货币为:【${userMoney2}】 赶快去赚些钱吧~ 加入游戏的大门随时为您敞开!`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } await sendMessage( session, `【@${username}】 🎉 欢迎加入 BlackJack/21 点游戏! 希望你能玩的开心! 游玩需要投注哦 ~ 您的货币余额为:【${userMoney2}】 ${allowZeroBetJoin && userMoney2 === 0 ? "检测到允许零投注!\n正在为您办理加入游戏手续中..." : "请输入您的【投注金额】:"}`, `${allowZeroBetJoin && userMoney2 === 0 ? "" : `输入投注金额`}` ); if (allowZeroBetJoin && userMoney2 === 0) { await (0, import_koishi.sleep)(joinGameProcedureWaitTimeInSeconds * 1e3); } bet = allowZeroBetJoin && userMoney2 === 0 ? 0 : Number(await session.prompt()); if (isNaN(bet)) { return await sendMessage( session, `【@${username}】 输入无效,重新来一次吧~`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } } if (config.minimumRequiredCurrencyForGameEntry > 0 && bet < config.minimumRequiredCurrencyForGameEntry) { return await sendMessage( session, `【@${username}】 您的投注不够呢! 最少所需投注为:【${config.minimumRequiredCurrencyForGameEntry}】`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } if (typeof bet !== "number" || (allowZeroBetJoin ? bet < 0 : bet <= 0)) { return await sendMessage( session, `【@${username}】 准备好投注金额,才可以加入游戏哦~`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } let userMoney = 0; let isBalanceSufficient = true; if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get("bella_sign_in", { id: session.userId }); if (bellaSignIn.length === 0) { if (!allowZeroBetJoin) { return await sendMessage( session, `【@${username}】 您还没有货币记录哦,快去签到吧!`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } } else { userMoney = bellaSignIn[0].point; } } else { let getUserMonetary = await ctx.database.get("monetary", { uid }); if (getUserMonetary.length === 0) { await ctx.database.create("monetary", { uid, value: 0, currency: "default" }); getUserMonetary = await ctx.database.get("monetary", { uid }); if (!allowZeroBetJoin) { return await sendMessage( session, `【@${username}】 您还没有货币记录呢~ 没办法投注的说... 不过别担心! 已经为您办理货币登记了呢~`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } } const userMonetary = getUserMonetary[0]; userMoney = userMonetary.value; } if (userMoney < bet) { isBalanceSufficient = false; bet = userMoney <= 0 ? 0 : userMoney; } if (bet === 0 && !allowZeroBetJoin) { return await sendMessage( session, `【@${username}】 不允许零投注哦~`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); } const [playerRecord] = await ctx.database.get("blackjack_player_record", { userId }); await ctx.database.set( "blackjack_player_record", { userId }, { moneyChange: playerRecord.moneyChange - bet } ); if (config.isBellaPluginPointsEnabledForCurrency) { await ctx.database.set( "bella_sign_in", { id: session.userId }, { point: userMoney - bet } ); } else { await ctx.monetary.cost(uid, bet); } await ctx.database.create("blackjack_playing_record", { channelId, userId, username, bet, playerHandIndex: 1 }); const numberOfPlayers = (await ctx.database.get("blackjack_playing_record", { channelId })).length; return await sendMessage( session, `【@${username}】 ${!isBalanceSufficient ? "检测到余额不足!\n已自动向下合并!\n\n" : ""}${bet === 0 && allowZeroBetJoin && userMoney !== 0 ? "检测到允许零投注!\n\n" : ""}投注成功! 您正式加入游戏了! 投注筹码数额为:【${bet}】 剩余通用货币为:【${userMoney - bet}】 当前玩家人数:${numberOfPlayers} 名!`, `改名 无庄模式 开始游戏 退出游戏 加入游戏 转账` ); }); ctx.command("blackJack.退出游戏", "退出游戏").userFields(["id", "name", "permissions"]).action(async ({ session }) => { let { channelId, userId, user, username } = session; if (!channelId) { channelId = `privateChat_${userId}`; } username = await getSessionUserName(session); const gameInfo = await ctx.database.get("blackjack_game_record", { channelId }); if (gameInfo.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${username}】 你都没加入呢,怎么退出?`, `退出游戏 加入游戏` ); } if (gameInfo[0].gameStatus !== "未开始") { return await sendMessage(session, "哼哼,游戏都开始了还想退出?", ``); } const playerInfo = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (playerInfo.length === 0) { return await sendMessage( session, `【@${username}】 加入了才能退出哦~`, `退出游戏 加入游戏` ); } const player = playerInfo[0]; if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get("bella_sign_in", { id: player.userId }); if (bellaSignIn.length !== 0) { await ctx.database.set( "bella_sign_in", { id: player.userId }, { point: bellaSignIn[0].point + player.bet } ); } } else { const uid = user.id; await ctx.monetary.gain(uid, player.bet); } await ctx.database.remove("blackjack_playing_record", { channelId, userId }); const numberOfPlayers = (await ctx.database.get("blackjack_playing_record", { channelId })).length; return await sendMessage( session, `【@${username}】 退出游戏成功! 钱已经退给你啦~ 剩余玩家人数:${numberOfPlayers} 名!`, `无庄模式 开始游戏 退出游戏 加入游戏` ); }); ctx.command("blackJack.开始游戏", "开始游戏").userFields(["id", "name", "permissions"]).option("noDealerMode", "-n 无庄模式", { fallback: false }).action(async ({ session, options }) => { let { channelId, userId, platform } = session; if (!channelId) { channelId = `privateChat_${userId}`; } const sessionUserName = await getSessionUserName(session); const gameInfo = await ctx.database.get("blackjack_game_record", { channelId }); if (gameInfo.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 没人怎么玩呀~`, `加入游戏` ); } if (gameInfo[0].gameStatus !== "未开始") { return await sendMessage( session, `【@${sessionUserName}】 已经开始了哦,待会儿记得来呀~`, `` ); } const getPlayers = await ctx.database.get( "blackjack_playing_record", { channelId } ); const numberOfPlayers = getPlayers.length; if (options.noDealerMode && numberOfPlayers < 2) { return await sendMessage( session, `【@${sessionUserName}】 无庄家模式至少需要两名玩家才能开始游戏哦~`, `加入游戏` ); } if (numberOfPlayers < 1) { return await sendMessage( session, `【@${sessionUserName}】 悲~ 没人玩的说...`, `加入游戏` ); } await ctx.database.set( "blackjack_game_record", { channelId }, { gameStatus: "投注时间" } ); let shuffledPlayersWithIndex = []; if (numberOfPlayers !== 1) { const shuffledPlayers = shuffleArray(getPlayers); await Promise.all( shuffledPlayers.map(async (player, index) => { const playerIndex = index + 1; await ctx.database.set( "blackjack_playing_record", { userId: player.userId, channelId: player.channelId }, { playerIndex, playerHandIndex: 1 } ); shuffledPlayersWithIndex.push({ index: playerIndex, player }); }) ); if (options.noDealerMode) { const minBet = Math.min(...getPlayers.map((player) => player.bet)); for (const player of getPlayers) { if (player.bet > minBet) { const refundAmount = player.bet - minBet; if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get("bella_sign_in", { id: player.userId }); if (bellaSignIn.length !== 0) { await ctx.database.set( "bella_sign_in", { id: player.userId }, { point: bellaSignIn[0].point + refundAmount } ); } } else { const uid = (await ctx.database.getUser(platform, player.userId)).id; await ctx.monetary.gain(uid, refundAmount); } await ctx.database.set( "blackjack_playing_record", { channelId, userId: player.userId }, { bet: minBet } ); } } const decks2 = generateDecks(numberOfDecks); const numTimes2 = 3; const shuffledDeck2 = shuffleArrayMultipleTimes(decks2, numTimes2); let playerWithIndexOne2; let betPlayer2; playerWithIndexOne2 = shuffledPlayersWithIndex.length > 0 ? shuffledPlayersWithIndex.find((item) => item.index === 1) : null; betPlayer2 = playerWithIndexOne2.player; const dealtCardToPunter2 = await dealCards(channelId, shuffledDeck2); await ctx.database.set( "blackjack_playing_record", { channelId, userId: betPlayer2.userId }, { playerHand: [`${dealtCardToPunter2}`], playerHandIndex: 1 } ); await sendMessage( session, ` 🎉 21 点游戏(无庄模式)开始! 检测到玩家最低投注金额为:【${minBet}】 所有玩家的投注已更改为:【${minBet}】 该局游戏的扑克牌副数为:【${numberOfDecks}】 第一位玩家是:【@${betPlayer2.username}】 您的第一张手牌为:【${dealtCardToPunter2}】 您当前的点数为:【${calculateScore(dealtCardToPunter2)}】 🤔 你还想要再拿一张牌吗?记住哦,如果超过21点就会爆掉哦~ 请选择您的操作: 【要牌】或【停牌】`, `要牌 停牌` ); await ctx.database.set( "blackjack_game_record", { channelId }, { deck: shuffledDeck2, currentPlayerIndex: 1, currentPlayerUserId: betPlayer2.userId, currentPlayerUserName: betPlayer2.username, gameStatus: "已开始", currentPlayerHandIndex: 1, isNoDealerMode: true } ); return; } const playerOrder = shuffledPlayersWithIndex.map( (item) => `${item.index}. 【${item.player.username ?? "Unknown"}】` ).join("\n"); const prompt = `当前阶段为:【投注牌型】 ⌚️ 投注时间为:【${betMaxDuration}】秒! 🎲 玩家序号: ${playerOrder} 🃏 投注类型: 1. 对子:闲家首两张牌相同点数,倍数为 5。 2. 同花对子:闲家首两张牌相同点数和花色,倍数为 30。 3. 同花:庄家第一张牌与闲家前两张牌同花色,倍数为 5。 4. 顺:庄家第一张牌与闲家前两张牌连号,倍数为 10。 5. 三条:庄家第一张牌与闲家前两张牌同点数,倍数为 25。 6. 同花顺:庄家第一张牌与闲家前两张牌同花色且连号,倍数为 25。 7. 同花三条:庄家第一张牌与闲家前两张牌同花色和点数,倍数为 50。 投注示例:投注 1 7 50 投注格式:投注 [玩家序号] [类型] [金额] 其他可选操作:【跳过投注】 【跳过投注】:闲家发送此操作可直接进入下一阶段。`; await sendMessage( session, ` 游戏开始! ${enableCardBetting ? prompt : ""} ⚠️ 注意:该局游戏使用【${numberOfDecks}】副扑克牌 ${!enableCardBetting || !enableSurrender ? `正在为庄家发牌... 请庄家亮牌!` : ""}`, `${enableCardBetting ? `跳过投注 投注牌型` : ""}` ); } else if (numberOfPlayers === 1) { const player = getPlayers[0]; await ctx.database.set( "blackjack_playing_record", { userId: player.userId, channelId }, { playerIndex: 1, playerHandIndex: 1 } ); const prompt = `当前阶段为:【投注牌型】 ⌚️ 投注时间为:【${betMaxDuration}】秒! 🎲 玩家序号: 1. 【${player.username}】 🃏 投注类型: 1. 对子:闲家首两张牌相同点数,倍数为 5。 2. 同花对子:闲家首两张牌相同点数和花色,倍数为 30。 3. 同花:庄家第一张牌与闲家前两张牌同花色,倍数为 5。 4. 顺:庄家第一张牌与闲家前两张牌连号,倍数为 10。 5. 三条:庄家第一张牌与闲家前两张牌同点数,倍数为 25。 6. 同花顺:庄家第一张牌与闲家前两张牌同花色且连号,倍数为 25。 7. 同花三条:庄家第一张牌与闲家前两张牌同花色和点数,倍数为 50。 投注示例:投注 1 7 50 投注格式:投注 [玩家序号] [类型] [金额] 其他可选操作:【跳过投注】 【跳过投注】:闲家发送此操作可直接进入下一阶段。`; await sendMessage( session, `【@${player.username}】 欢迎来到黑杰克的世界! 你是今天唯一的挑战者,你敢和我赌一把吗? ${enableCardBetting ? prompt : ""} ⚠️ 注意:该局游戏使用【${numberOfDecks}】副扑克牌 ${!enableCardBetting || !enableSurrender ? `正在为庄家发牌... 请庄家亮牌!` : ""}`, `${enableCardBetting ? `跳过投注 投注牌型` : ""}` ); } if (!enableCardBetting || !enableSurrender) { await (0, import_koishi.sleep)(dealerSpeed * 1e3); } if (enableCardBetting) { await ctx.database.set( "blackjack_game_record", { channelId }, { gameStatus: "投注时间" } ); const gameStatus = await getGameStatus(channelId); if (gameStatus === "投注时间") { await ctx.database.set( "blackjack_game_record", { channelId }, { gameStatus: "投注时间结束" } ); await sendMessage(session, `投注时间已到,下一阶段开始!`, ``); } } const decks = generateDecks(numberOfDecks); const numTimes = 3; const shuffledDeck = shuffleArrayMultipleTimes(decks, numTimes); let playerWithIndexOne; let betPlayer; if (numberOfPlayers !== 1) { playerWithIndexOne = shuffledPlayersWithIndex.length > 0 ? shuffledPlayersWithIndex.find((item) => item.index === 1) : null; betPlayer = playerWithIndexOne.player; } else { betPlayer = getPlayers[0]; } const dealtCardToBanker = await dealCards(channelId, shuffledDeck); const dealtCardToPunter = await dealCards(channelId, shuffledDeck); await ctx.database.set( "blackjack_game_record", { channelId }, { deck: shuffledDeck, canSurrender: true, currentPlayerIndex: 1, currentPlayerUserId: betPlayer.userId, currentPlayerUserName: betPlayer.username, gameStatus: "已开始", currentPlayerHandIndex: 1 } ); if (enableSurrender) { await sendMessage( session, `庄家亮牌:【${dealtCardToBanker}】 点数为:【${calculateScore(dealtCardToBanker)}】 当前阶段为:【投降】 ⌚️ 持续时间为:【${surrenderMaxDuration}】秒! 投降倒计时开始! 玩家可以在【${surrenderMaxDuration}】秒内选择是否投降! 【投降】:退回半注。 【跳过投降】:直接进入下一阶段。`, `跳过投降 投降` ); const gameCanSurrender = await getGameCanSurrender(channelId); if (gameCanSurrender === true) { await ctx.database.set( "blackjack_game_record", { channelId }, { canSurrender: false } ); await sendMessage(session, `投降已截止,下一阶段开始!`, ``); } const result = await ctx.database.get("blackjack_game_record", { channelId }); if (result.length === 0) { return; } } await ctx.database.set( "blackjack_game_record", { channelId }, { bankerHand: [`${dealtCardToBanker}`] } ); await ctx.database.set( "blackjack_playing_record", { channelId, userId: betPlayer.userId }, { playerHand: [`${dealtCardToPunter}`], playerHandIndex: 1 } ); if (calculateScore(dealtCardToBanker) === 11) { await ctx.database.set( "blackjack_game_record", { channelId }, { canBuyInsurance: true } ); await sendMessage( session, `庄家亮牌:【${dealtCardToBanker}】 点数为:【11】点! 当前阶段为:【买保险】 ⌚️ 持续时间为:【${buyInsuranceMaxDuration}】秒! 买保险倒计时开始! 玩家可以在【${buyInsuranceMaxDuration}】秒内选择是否买保险! 【买保险】:花费半注,若庄家黑杰克则获得双倍赔偿,否则损失半注。 【跳过买保险】:直接进入下一阶段。`, `跳过买保险 买保险` ); const gameCanBuyInsurance = await getGameCanBuyInsurance(channelId); if (gameCanBuyInsurance === true) { await ctx.database.set( "blackjack_game_record", { channelId }, { canBuyInsurance: false } ); await sendMessage(session, `买保险已截止,游戏正式开始!`, ``); } const betPlayerName = betPlayer.username; return await sendMessage( session, `第一位玩家是:【@${betPlayerName}】 您的第一张牌为:【${dealtCardToPunter}】 您当前的点数为:【${calculateScore(dealtCardToPunter)}】 🤔 你还想要再拿一张牌吗?记住哦,如果超过21点就会爆掉哦~ 请选择您的操作: 【要牌】或【停牌】`, `要牌 停牌` ); } return await sendMessage( session, `庄家亮牌:【${dealtCardToBanker}】 点数为:【${calculateScore(dealtCardToBanker)}】 第一位玩家是:【@${betPlayer.username}】 您的第一张手牌为:【${dealtCardToPunter}】 您当前的点数为:【${calculateScore(dealtCardToPunter)}】 🤔 你还想要再拿一张牌吗?记住哦,如果超过21点就会爆掉哦~ 请选择您的操作: 【要牌】或【停牌】`, `要牌 停牌` ); }); ctx.command("blackJack.投降", "投降").userFields(["id", "name", "permissions"]).action(async ({ session }) => { const sessionUserName = await getSessionUserName(session); if (!enableSurrender) { return await sendMessage( session, `【@${sessionUserName}】 投降功能已关闭。`, `` ); } let { channelId, userId, user, username } = session; const uid = user.id; if (!channelId) { channelId = `privateChat_${userId}`; } const getGameInfo = await ctx.database.get("blackjack_game_record", { channelId }); if (getGameInfo.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 哼~ 最看不起投降的人了!`, `投降` ); } const gameInfo = getGameInfo[0]; if (gameInfo.gameStatus !== "已开始") { return await sendMessage( session, `【@${sessionUserName}】 还没开始呢笨蛋,这么想投降啊?`, `无庄模式 开始游戏 退出游戏 加入游戏` ); } const getPlayer = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (getPlayer.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 你都没来陪我一起玩就想投降?`, `` ); } if (!gameInfo.canSurrender) { return await sendMessage( session, `【@${sessionUserName}】 笨蛋,现在可不能投降!`, `` ); } const player = getPlayer[0]; if (player.isSurrender) { return await sendMessage( session, `【@${sessionUserName}】 你难道想投降两次嘛!`, `` ); } const refundAmount = (player.bet + player.betAmount) / 2; if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get("bella_sign_in", { id: userId }); if (bellaSignIn.length !== 0) { await ctx.database.set( "bella_sign_in", { id: userId }, { point: bellaSignIn[0].point + refundAmount } ); } } else { await ctx.monetary.gain(uid, refundAmount); } const [playerRecord] = await ctx.database.get("blackjack_player_record", { userId }); await ctx.database.set( "blackjack_player_record", { userId }, { moneyChange: playerRecord.moneyChange + refundAmount, lose: playerRecord.lose + 1 } ); const [userMonetary] = await ctx.database.get("monetary", { uid }); await ctx.database.set( "blackjack_playing_record", { channelId, userId }, { isSurrender: true } ); const theGameResult = await isGameEnded(channelId); if (gameInfo.currentPlayerIndex === player.playerIndex && theGameResult) { await ctx.database.remove("blackjack_playing_record", { channelId }); await ctx.database.remove("blackjack_game_record", { channelId }); return await sendMessage( session, `【@${sessionUserName}】 游戏还未开始,你们却都投降了,我感到失望。算了,游戏就此结束,祝你们好运。`, `查询玩家记录 排行榜 加入游戏` ); } return await sendMessage( session, `【@${username}】 您投降惹~ 损失货币:【${refundAmount}】 您当前的余额为:【${userMonetary.value}】`, `投降` ); }); ctx.command("blackJack.重新开始", "重新开始").userFields(["id", "name", "permissions"]).action(async ({ session }) => { let { channelId, bot, platform, userId } = session; if (!channelId) { channelId = `privateChat_${userId}`; } const sessionUserName = await getSessionUserName(session); const getGameInfo = await ctx.database.get("blackjack_game_record", { channelId }); if (getGameInfo.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 现在的情况根本没必要重新开始嘛!`, `查询玩家记录 排行榜 加入游戏` ); } const gameInfo = getGameInfo[0]; if (gameInfo.gameStatus === "未开始") { const getPlayers2 = await ctx.database.get("blackjack_playing_record", { channelId }); for (const player of getPlayers2) { const uid = (await ctx.database.getUser(platform, player.userId)).id; await ctx.monetary.gain(uid, player.bet); } await ctx.database.remove("blackjack_playing_record", { channelId }); await ctx.database.remove("blackjack_game_record", { channelId }); return await sendMessage( session, `【@${sessionUserName}】 哼,既然游戏还没开始的话,只好把钱退给你们咯~`, `查询玩家记录 排行榜 加入游戏` ); } const getPlayers = await ctx.database.get("blackjack_playing_record", { channelId }); for (const player of getPlayers) { const [playerRecord] = await ctx.database.get( "blackjack_player_record", { userId: player.userId } ); await ctx.database.set( "blackjack_player_record", { userId: player.userId }, { lose: playerRecord.lose + 1 } ); } await removeRecordsByChannelId(channelId); return await sendMessage( session, `【${sessionUserName}】 你们失败了,只能重新开始了~ 你们的钱就拜拜了~ 哈哈~`, `查询玩家记录 排行榜 加入游戏` ); }); ctx.command( "blackJack.投注 [playerIndex:number] [betType:string] [betAmount:number]", "投注牌型" ).userFields(["id", "name", "permissions"]).action(async ({ session }, playerIndex, betType, betAmount) => { const sessionUserName = await getSessionUserName(session); if (!enableCardBetting) { return await sendMessage( session, `【@${sessionUserName}】 投注牌型功能已关闭。`, `` ); } if (!playerIndex || !betType || !betAmount) { return await sendMessage( session, `【@${sessionUserName}】 请输入投注信息,格式如下: 投注 [玩家序号] [牌型] [金额] 示例:投注 1 7 50`, `投注牌型` ); } let { channelId, userId, user, username } = session; const uid = user.id; if (!channelId) { channelId = `privateChat_${userId}`; } const getGameInfo = await ctx.database.get("blackjack_game_record", { channelId }); if (getGameInfo.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 开始游戏之后才能投注呢~`, `无庄模式 开始游戏 退出游戏 加入游戏` ); } const gameInfo = getGameInfo[0]; if (gameInfo.gameStatus !== "投注时间") { return await sendMessage( session, `【@${sessionUserName}】 现在不在投注时间哦~`, `` ); } let betPlayer; const getPlayers = await ctx.database.get("blackjack_playing_record", { channelId }); const numberOfPlayers = getPlayers.length; const getThisPlayer = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (getThisPlayer.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 加入游戏才可以投注!`, `` ); } const thisPlayer = getThisPlayer[0]; if (thisPlayer.betAmount) { return await sendMessage( session, `【@${sessionUserName}】 笨蛋,买定离手哦,才不给你更改投注!`, `投注牌型` ); } if (numberOfPlayers === 1) { betPlayer = getPlayers[0]; } else { const getBetPlayer = await ctx.database.get( "blackjack_playing_record", { channelId, playerIndex } ); betPlayer = getBetPlayer[0]; } const cardTypes = { 1: "对子", 2: "同花对子", 3: "同花", 4: "顺", 5: "三条", 6: "同花顺", 7: "同花三条" }; function getCardType(number) { return cardTypes[number] || "未知牌型"; } __name(getCardType, "getCardType"); const betTypeNumber = Number(betType); if (!isNaN(betTypeNumber) && betTypeNumber >= 1 && betTypeNumber <= 8) { betType = getCardType(betTypeNumber); } else { if (!(betType in cardTypes)) { return await sendMessage( session, `【@${sessionUserName}】 傻瓜,给我个有效的牌型!`, `投注牌型` ); } } if (typeof betAmount !== "number" || betAmount <= 0) { return await sendMessage( session, `【@${sessionUserName}】 哼,给我爆金币!`, `投注牌型` ); } let userMoney = 0; if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get("bella_sign_in", { id: userId }); if (bellaSignIn.length !== 0) { userMoney = bellaSignIn[0].point; } } else { const [userMonetary] = await ctx.database.get("monetary", { uid }); userMoney = userMonetary.value; } if (userMoney < betAmount) { return await sendMessage( session, `【@${sessionUserName}】 你怎么这么穷惹~ 没钱了啦! 你当前的货币数额为:【${userMoney}】个。`, `投注牌型` ); } const [playerRecord] = await ctx.database.get("blackjack_player_record", { userId }); await ctx.database.set( "blackjack_player_record", { userId }, { moneyChange: playerRecord.moneyChange - betAmount } ); if (config.isBellaPluginPointsEnabledForCurrency) { const bellaSignIn = await ctx.database.get("bella_sign_in", { id: userId }); if (bellaSignIn.length !== 0) { await ctx.database.set( "bella_sign_in", { id: userId }, { point: bellaSignIn[0].point - betAmount } ); } } else { await ctx.monetary.cost(uid, betAmount); } await ctx.database.set( "blackjack_playing_record", { channelId, userId }, { betPlayerUserId: betPlayer.userId, betPlayerUserName: betPlayer.username, betType, betAmount } ); const multiplier = getCardTypeMultiplier(betType); return await sendMessage( session, `【@${username}】 投注成功! 您投注了【${betType}】(${multiplier}倍)牌型! 投注对象为:【@${betPlayer.username}】 投注金额:【${betAmount}】`, `投注牌型` ); }); ctx.command("blackJack.跳过投注", "跳过投注牌型的等待时间").userFields(["id", "name", "permissions"]).action(async ({ session }) => { const sessionUserName = await getSessionUserName(session); if (!enableCardBetting) { return await sendMessage( session, `【@${sessionUserName}】 投注牌型功能已关闭。`, `` ); } let { channelId, userId, username, user } = session; username = sessionUserName; if (!channelId) { channelId = `privateChat_${userId}`; } const getPlayer = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (getPlayer.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 不加入怎么用指令呢~`, `加入游戏` ); } let gameRecord = await ctx.database.get("blackjack_game_record", { channelId }); if (gameRecord.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 笨蛋~ 还没开始呢!`, `无庄模式 开始游戏 退出游戏 加入游戏` ); } const gameInfo = gameRecord[0]; if (gameInfo.gameStatus !== "投注时间") { return await sendMessage( session, `【@${sessionUserName}】 现在不在投注时间哦~`, `` ); } await ctx.database.set( "blackjack_game_record", { channelId }, { gameStatus: "投注时间结束" } ); return await sendMessage( session, `玩家【@${username}】执行【跳过投注】操作,【投注】通道已关闭!`, `` ); }); ctx.command("blackJack.跳过买保险", "跳过买保险的等待时间").userFields(["id", "name", "permissions"]).action(async ({ session }) => { const sessionUserName = await getSessionUserName(session); let { channelId, userId, username, user } = session; username = sessionUserName; if (!channelId) { channelId = `privateChat_${userId}`; } const getPlayer = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (getPlayer.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 你不在游戏里的说...`, `加入游戏` ); } let gameRecord = await ctx.database.get("blackjack_game_record", { channelId }); if (gameRecord.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 游戏还没开始呢!`, `无庄模式 开始游戏 退出游戏 加入游戏` ); } const gameInfo = gameRecord[0]; if (!gameInfo.canBuyInsurance) { return await sendMessage( session, `【@${sessionUserName}】 现在可买不了保险~`, `` ); } await ctx.database.set( "blackjack_game_record", { channelId }, { canBuyInsurance: false } ); return await sendMessage( session, `【@${username}】 您执行了【跳过买保险】操作! 【买保险】通道已关闭!`, `` ); }); ctx.command("blackJack.跳过投降", "跳过投降的等待时间").userFields(["id", "name", "permissions"]).action(async ({ session }) => { const sessionUserName = await getSessionUserName(session); if (!enableSurrender) { return await sendMessage( session, `【@${sessionUserName}】 投降功能已关闭。`, `` ); } let { channelId, userId, username, user } = session; username = sessionUserName; if (!channelId) { channelId = `privateChat_${userId}`; } const getPlayer = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (getPlayer.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 你还不在游戏里面哦~`, `加入游戏` ); } let gameRecord = await ctx.database.get("blackjack_game_record", { channelId }); if (gameRecord.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 还没开始呢!`, `无庄模式 开始游戏 退出游戏 加入游戏` ); } const gameInfo = gameRecord[0]; if (!gameInfo.canSurrender) { return await sendMessage( session, `【@${sessionUserName}】 还没到可以跳过的时候呢~`, `` ); } await ctx.database.set( "blackjack_game_record", { channelId }, { canSurrender: false } ); return await sendMessage( session, `【@${username}】 您执行了【跳过投降】操作! 【投降】通道已关闭!`, `投降` ); }); ctx.command("blackJack.买保险", "买保险").userFields(["id", "name", "permissions"]).action(async ({ session }) => { let { channelId, userId, username } = session; const sessionUserName = await getSessionUserName(session); username = sessionUserName; if (!channelId) { channelId = `privateChat_${userId}`; } const getPlayer = await ctx.database.get("blackjack_playing_record", { channelId, userId }); if (getPlayer.length === 0) { return await sendMessage( session, `【@${sessionUserName}】 想买保险?先加入游戏再说!笨蛋~`, `加入游戏` ); } const player = getPlayer[0]; if (player.isBuyInsurance) { return await sendMessage( session, `【@${sessionUserName}】 买一次就够了,笨蛋!而且只能买一次好不好!`, `买保险` ); } const getGameInfo = await ctx.database.get("blackjack_game_record", { channelId }); if (getGameInfo.length === 0) { await ctx.database.create("blackjack_game_record", { channelId, gameStatus: "未开始" }); return await sendMessage( session, `【@${sessionUserName}】 游戏还没开始呢~ 买不了保险的说...`, `无庄模式 开始游戏 退出游戏 加入游戏` ); } const gameInfo = getGameInfo[0]; if (gameInfo.gameSta