Files
WPSBot/games/base.py

211 lines
6.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""游戏基类"""
import logging
from abc import ABC, abstractmethod
from core.database import get_db
logger = logging.getLogger(__name__)
class BaseGame(ABC):
"""游戏基类"""
def __init__(self):
"""初始化游戏"""
self.db = get_db()
@abstractmethod
async def handle(self, command: str, chat_id: int, user_id: int) -> str:
"""处理游戏指令
Args:
command: 完整指令
chat_id: 会话ID
user_id: 用户ID
Returns:
回复消息
"""
raise NotImplementedError
@abstractmethod
def get_help(self) -> str:
"""获取帮助信息
Returns:
帮助文本
"""
raise NotImplementedError
def get_help_message() -> str:
"""获取总体帮助信息"""
help_text = """## 🎮 WPS游戏机器人帮助
### 🎲 骰娘系统
- `.r XdY` - 掷骰子(如:.r 1d20
- `.r XdY+Z` - 带修正掷骰(如:.r 2d6+3
### ✊ 石头剪刀布
- `.rps 石头` - 出石头
- `.rps 剪刀` - 出剪刀
- `.rps 布` - 出布
- `.rps stats` - 查看战绩
### 🔮 运势占卜
- `.fortune` - 今日运势
- `.运势` - 今日运势
### 🔢 猜数字游戏
- `.guess start` - 开始游戏
- `.guess 数字` - 猜测数字
- `.guess stop` - 结束游戏
### 📝 问答游戏
- `.quiz` - 随机问题
- `.quiz 答案` - 回答问题
### 🀄 成语接龙
- `.idiom start [成语]` - 开始游戏
- `.idiom [成语]` - 接龙
- `.idiom [成语] @某人` - 接龙并指定下一位
- `.idiom stop` - 结束游戏
- `.idiom status` - 查看状态
- `.idiom reject [词语]` - 拒绝词语加入黑名单(仅发起人)
- `.idiom blacklist` - 查看黑名单
### ⚫ 五子棋
- `.gomoku challenge` - 发起挑战
- `.gomoku accept` - 接受挑战
- `.gomoku A1` - 落子
- `.gomoku show` - 显示棋盘
- `.gomoku resign` - 认输
- `.gomoku list` - 列出所有对战
- `.gomoku stats` - 查看战绩
### 💎 积分系统
- `.points` - 查看个人积分
- `.积分` - 查看个人积分
- `.checkin` - 每日签到
- `.签到` - 每日签到
- `.打卡` - 每日签到
- `.points leaderboard` - 积分排行榜
### ⚗️ 炼金系统
- `.alchemy` - 消耗10积分进行炼金
- `.炼金` - 消耗10积分进行炼金
- `.alchemy 20` - 消耗20积分进行炼金
- `.alchemy 50` - 消耗50积分进行炼金
### ⚡️ 冒险系统
- `.adventure` - 消耗1分钟进行冒险
- `.冒险` - 消耗1分钟进行冒险
- `.adventure 5` - 消耗5分钟进行冒险
- `.adventure abandon` - 放弃当前冒险,按最低倍率结算已冒险时间
- `.adventure 放弃` - 放弃当前冒险,按最低倍率结算已冒险时间
- `.adventure help` - 查看冒险帮助
### 🎁 积分赠送系统
- `.gift <用户ID> <积分数量> [消息]` - 赠送积分
- `.赠送 <用户ID> <积分数量> [消息]` - 赠送积分
- `.送 <用户ID> <积分数量> [消息]` - 赠送积分
### 🤖 AI对话系统
- `.ai <问题>` - 向AI提问支持多用户对话等待10秒后回答
- `.aiconfig host=xxx port=xxx model=xxx` - 配置Ollama服务地址和模型
### 🎰 赌场系统
**大小游戏**
- `.赌场 大小 open <最小> <最大> <赔率>` - 庄家开启大小游戏
- `.赌场 大小 bet <大/小> <金额>` - 下注
- `.赌场 大小 status` - 查看状态
- `.赌场 大小 settle` - 庄家结算(系统随机)
- `.赌场 大小 cancel` - 庄家放弃游戏(返还下注)
**轮盘游戏**
- `.赌场 轮盘 open <最小> <最大>` - 庄家开启轮盘游戏
- `.赌场 轮盘 bet <类型> <选项> <金额>` - 下注(数字/颜色/奇偶/大小/区间)
- `.赌场 轮盘 status` - 查看状态
- `.赌场 轮盘 settle` - 庄家结算系统随机0-36
- `.赌场 轮盘 cancel` - 庄家放弃游戏(返还下注)
**21点游戏**
- `.赌场 21点 open <最小> <最大> [黑杰克倍数]` - 庄家开启21点游戏
- `.赌场 21点 bet <金额>` - 下注
- `.赌场 21点 deal` - 庄家发牌
- `.赌场 21点 hit` - 玩家要牌
- `.赌场 21点 stand` - 玩家停牌
- `.赌场 21点 status` - 查看状态
- `.赌场 21点 settle` - 庄家结算
- `.赌场 21点 cancel` - 庄家放弃游戏(返还下注)
### 🐺 狼人杀
- `.狼人杀 open` - 主持人创建房间
- `.狼人杀 join` - 加入游戏
- `.狼人杀 start` - 主持人开始游戏
- `.狼人杀 <id> <消息>` - 私聊指定玩家
- `.狼人杀 狼人 <消息>` - 狼人群聊
- `.狼人杀 杀 <id>` - 狼人投票杀人
- `.狼人杀 验 <id>` - 预言家验人
- `.狼人杀 救 <id>` - 女巫救人
- `.狼人杀 毒 <id>` - 女巫毒人
- `.狼人杀 status` - 查看状态
### 其他
- `.help` - 显示帮助
- `.stats` - 查看个人统计
---
💡 提示:@机器人 + 指令即可使用
"""
return help_text
def get_stats_message(user_id: int) -> str:
"""获取用户统计信息"""
db = get_db()
cursor = db.conn.cursor()
# 获取所有游戏统计
cursor.execute(
"SELECT game_type, wins, losses, draws, total_plays FROM game_stats WHERE user_id = ?",
(user_id,)
)
stats = cursor.fetchall()
if not stats:
return "📊 你还没有游戏记录哦~快来玩游戏吧!"
# 构建统计信息
text = "## 📊 你的游戏统计\n\n"
game_names = {
'rps': '✊ 石头剪刀布',
'guess': '🔢 猜数字',
'quiz': '📝 问答游戏',
'idiom': '🀄 成语接龙',
'gomoku': '⚫ 五子棋'
}
for row in stats:
game_type = row[0]
wins = row[1]
losses = row[2]
draws = row[3]
total = row[4]
game_name = game_names.get(game_type, game_type)
win_rate = (wins / total * 100) if total > 0 else 0
text += f"### {game_name}\n"
text += f"- 总局数:{total}\n"
text += f"- 胜利:{wins}\n"
text += f"- 失败:{losses}\n"
if draws > 0:
text += f"- 平局:{draws}\n"
text += f"- 胜率:{win_rate:.1f}%\n\n"
return text