mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-01 17:49:58 +08:00
update 0.0.6.0
This commit is contained in:
+37
-15
@@ -5,13 +5,13 @@ from nonebot.adapters.cqhttp import GROUP, Bot, GroupMessageEvent, Message
|
||||
from nonebot.typing import T_State
|
||||
from utils.utils import get_message_text, is_number, get_message_at
|
||||
from models.group_member_info import GroupInfoUser
|
||||
from utils.message_builder import at
|
||||
from models.russian_user import RussianUser
|
||||
from utils.message_builder import at, image
|
||||
from .model import RussianUser
|
||||
from models.bag_user import BagUser
|
||||
from services.log import logger
|
||||
import time
|
||||
from .data_source import rank
|
||||
from configs.config import MAX_RUSSIAN_BET_GOLD, NICKNAME
|
||||
from configs.config import NICKNAME, Config
|
||||
|
||||
__zx_plugin_name__ = "俄罗斯轮盘"
|
||||
__plugin_usage__ = """
|
||||
@@ -47,6 +47,13 @@ __plugin_settings__ = {
|
||||
"limit_superuser": False,
|
||||
"cmd": ["俄罗斯轮盘", "装弹"],
|
||||
}
|
||||
__plugin_configs__ = {
|
||||
"MAX_RUSSIAN_BET_GOLD": {
|
||||
"value": 1000,
|
||||
"help": "俄罗斯轮盘最大赌注金额",
|
||||
"default_value": 1000,
|
||||
}
|
||||
}
|
||||
|
||||
rs_player = {}
|
||||
|
||||
@@ -228,7 +235,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
and rs_player[event.group_id][2]
|
||||
and time.time() - rs_player[event.group_id]["time"] > 30
|
||||
):
|
||||
await shot.send("决斗已过时,强行结算...")
|
||||
await russian.send("决斗已过时,强行结算...")
|
||||
await end_game(bot, event)
|
||||
if (
|
||||
not rs_player[event.group_id][2]
|
||||
@@ -250,11 +257,15 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
msg = msg[0].strip()
|
||||
if is_number(msg) and not (int(msg) < 1 or int(msg) > 6):
|
||||
state["bullet_num"] = int(msg)
|
||||
if is_number(money) and 0 < int(money) <= MAX_RUSSIAN_BET_GOLD:
|
||||
if is_number(money) and 0 < int(money) <= Config.get_config(
|
||||
"russian", "MAX_RUSSIAN_BET_GOLD"
|
||||
):
|
||||
state["money"] = int(money)
|
||||
else:
|
||||
state["money"] = 200
|
||||
await russian.send(f"赌注金额超过限制({MAX_RUSSIAN_BET_GOLD}),已改为200(默认)")
|
||||
await russian.send(
|
||||
f"赌注金额超过限制({Config.get_config('russian', 'MAX_RUSSIAN_BET_GOLD')}),已改为200(默认)"
|
||||
)
|
||||
state["at"] = get_message_at(event.json())
|
||||
|
||||
|
||||
@@ -267,8 +278,11 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
user_money = await BagUser.get_gold(event.user_id, event.group_id)
|
||||
if bullet_num < 0 or bullet_num > 6:
|
||||
await russian.reject("子弹数量必须大于0小于7!速速重新装弹!")
|
||||
if money > MAX_RUSSIAN_BET_GOLD:
|
||||
await russian.finish(f"太多了!单次金额不能超过{MAX_RUSSIAN_BET_GOLD}!", at_sender=True)
|
||||
if money > Config.get_config("russian", "MAX_RUSSIAN_BET_GOLD"):
|
||||
await russian.finish(
|
||||
f"太多了!单次金额不能超过{Config.get_config('russian', 'MAX_RUSSIAN_BET_GOLD')}!",
|
||||
at_sender=True,
|
||||
)
|
||||
if money > user_money:
|
||||
await russian.finish("你没有足够的钱支撑起这场挑战", at_sender=True)
|
||||
|
||||
@@ -433,6 +447,7 @@ async def end_game(bot: Bot, event: GroupMessageEvent):
|
||||
for x in rs_player[event.group_id]["bullet"]:
|
||||
bullet_str += "__ " if x == 0 else "| "
|
||||
logger.info(f"俄罗斯轮盘:胜者:{win_name} - 败者:{lose_name} - 金币:{money}")
|
||||
rs_player[event.group_id] = {}
|
||||
await bot.send(
|
||||
event,
|
||||
message=f"结算:\n"
|
||||
@@ -449,7 +464,6 @@ async def end_game(bot: Bot, event: GroupMessageEvent):
|
||||
f"哼哼,{NICKNAME}从中收取了 {float(rand)}%({fee}金币) 作为手续费!\n"
|
||||
f"子弹排列:{bullet_str[:-1]}",
|
||||
)
|
||||
rs_player[event.group_id] = {}
|
||||
|
||||
|
||||
@record.handle()
|
||||
@@ -471,18 +485,26 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
|
||||
@russian_rank.handle()
|
||||
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
num = get_message_text(event.json())
|
||||
if is_number(num) and 51 > int(num) > 10:
|
||||
num = int(num)
|
||||
else:
|
||||
num = 10
|
||||
rank_image = None
|
||||
if state["_prefix"]["raw_command"] in ["胜场排行", "胜利排行"]:
|
||||
await russian_rank.finish(await rank(event.group_id, "win_rank"))
|
||||
rank_image = await rank(event.group_id, "win_rank", num)
|
||||
if state["_prefix"]["raw_command"] in ["败场排行", "失败排行"]:
|
||||
await russian_rank.finish(await rank(event.group_id, "lose_rank"))
|
||||
rank_image = await rank(event.group_id, "lose_rank", num)
|
||||
if state["_prefix"]["raw_command"] == "欧洲人排行":
|
||||
await russian_rank.finish(await rank(event.group_id, "make_money"))
|
||||
rank_image = await rank(event.group_id, "make_money", num)
|
||||
if state["_prefix"]["raw_command"] == "慈善家排行":
|
||||
await russian_rank.finish(await rank(event.group_id, "spend_money"))
|
||||
rank_image = await rank(event.group_id, "spend_money", num)
|
||||
if state["_prefix"]["raw_command"] == "最高连胜排行":
|
||||
await russian_rank.finish(await rank(event.group_id, "max_winning_streak"))
|
||||
rank_image = await rank(event.group_id, "max_winning_streak", num)
|
||||
if state["_prefix"]["raw_command"] == "最高连败排行":
|
||||
await russian_rank.finish(await rank(event.group_id, "max_losing_streak"))
|
||||
rank_image = await rank(event.group_id, "max_losing_streak", num)
|
||||
if rank_image:
|
||||
await russian_rank.send(image(b64=rank_image.pic2bs4()))
|
||||
|
||||
|
||||
# 随机子弹排列
|
||||
|
||||
@@ -1,32 +1,34 @@
|
||||
from models.russian_user import RussianUser
|
||||
from .model import RussianUser
|
||||
from typing import Optional
|
||||
from utils.data_utils import init_rank
|
||||
from utils.image_utils import CreateMat
|
||||
|
||||
|
||||
async def rank(group_id: int, itype) -> str:
|
||||
async def rank(group_id: int, itype: str, num: int) -> Optional[CreateMat]:
|
||||
all_users = await RussianUser.get_all_user(group_id)
|
||||
all_user_id = [user.user_qq for user in all_users]
|
||||
if itype == 'win_rank':
|
||||
rank_name = '\t胜场排行榜\n'
|
||||
rank_name = '胜场排行榜'
|
||||
all_user_data = [user.win_count for user in all_users]
|
||||
elif itype == 'lose_rank':
|
||||
rank_name = '\t败场排行榜\n'
|
||||
rank_name = '败场排行榜'
|
||||
all_user_data = [user.fail_count for user in all_users]
|
||||
elif itype == 'make_money':
|
||||
rank_name = '\t赢取金币排行榜\n'
|
||||
rank_name = '赢取金币排行榜'
|
||||
all_user_data = [user.make_money for user in all_users]
|
||||
elif itype == 'spend_money':
|
||||
rank_name = '\t输掉金币排行榜\n'
|
||||
rank_name = '输掉金币排行榜'
|
||||
all_user_data = [user.lose_money for user in all_users]
|
||||
elif itype == 'max_winning_streak':
|
||||
rank_name = '\t最高连胜排行榜\n'
|
||||
rank_name = '最高连胜排行榜'
|
||||
all_user_data = [user.max_winning_streak for user in all_users]
|
||||
else:
|
||||
rank_name = '\t最高连败排行榜\n'
|
||||
rank_name = '最高连败排行榜'
|
||||
all_user_data = [user.max_losing_streak for user in all_users]
|
||||
rst = ''
|
||||
rst = None
|
||||
if all_users:
|
||||
rst = await init_rank(all_user_id, all_user_data, group_id)
|
||||
return rank_name + rst
|
||||
rst = await init_rank(rank_name, all_user_id, all_user_data, group_id, num)
|
||||
return rst
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,129 @@
|
||||
from services.db_context import db
|
||||
from typing import List
|
||||
|
||||
|
||||
class RussianUser(db.Model):
|
||||
__tablename__ = "russian_users"
|
||||
__table_args__ = {'extend_existing': True}
|
||||
|
||||
id = db.Column(db.Integer(), primary_key=True)
|
||||
user_qq = db.Column(db.BigInteger(), nullable=False)
|
||||
group_id = db.Column(db.BigInteger(), nullable=False)
|
||||
win_count = db.Column(db.Integer(), default=0)
|
||||
fail_count = db.Column(db.Integer(), default=0)
|
||||
make_money = db.Column(db.Integer(), default=0)
|
||||
lose_money = db.Column(db.Integer(), default=0)
|
||||
winning_streak = db.Column(db.Integer(), default=0)
|
||||
losing_streak = db.Column(db.Integer(), default=0)
|
||||
max_winning_streak = db.Column(db.Integer(), default=0)
|
||||
max_losing_streak = db.Column(db.Integer(), default=0)
|
||||
|
||||
_idx1 = db.Index("russian_group_users_idx1", "user_qq", "group_id", unique=True)
|
||||
|
||||
@classmethod
|
||||
async def ensure(cls, user_qq: int, group_id: int) -> "RussianUser":
|
||||
"""
|
||||
说明:
|
||||
获取用户对象
|
||||
参数:
|
||||
:param user_qq: qq号
|
||||
:param group_id: 群号
|
||||
"""
|
||||
user = (
|
||||
await cls.query.where((cls.user_qq == user_qq) & (cls.group_id == group_id))
|
||||
.with_for_update()
|
||||
.gino.first()
|
||||
)
|
||||
return user or await cls.create(user_qq=user_qq, group_id=group_id)
|
||||
|
||||
@classmethod
|
||||
async def add_count(cls, user_qq: int, group_id: int, itype: str) -> bool:
|
||||
"""
|
||||
说明:
|
||||
添加用户输赢次数
|
||||
说明:
|
||||
:param user_qq: qq号
|
||||
:param group_id: 群号
|
||||
:param itype: 输或赢 'win' or 'lose'
|
||||
"""
|
||||
try:
|
||||
user = (
|
||||
await cls.query.where(
|
||||
(cls.user_qq == user_qq) & (cls.group_id == group_id)
|
||||
)
|
||||
.with_for_update()
|
||||
.gino.first()
|
||||
)
|
||||
if not user:
|
||||
user = await cls.create(user_qq=user_qq, group_id=group_id)
|
||||
if itype == "win":
|
||||
_max = (
|
||||
user.max_winning_streak
|
||||
if user.max_winning_streak > user.winning_streak + 1
|
||||
else user.winning_streak + 1
|
||||
)
|
||||
await user.update(
|
||||
win_count=user.win_count + 1,
|
||||
winning_streak=user.winning_streak + 1,
|
||||
losing_streak=0,
|
||||
max_winning_streak=_max
|
||||
).apply()
|
||||
elif itype == "lose":
|
||||
_max = (
|
||||
user.max_losing_streak
|
||||
if user.max_losing_streak > user.losing_streak + 1
|
||||
else user.losing_streak + 1
|
||||
)
|
||||
await user.update(
|
||||
fail_count=user.fail_count + 1,
|
||||
losing_streak=user.losing_streak + 1,
|
||||
winning_streak=0,
|
||||
max_losing_streak=_max,
|
||||
).apply()
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
async def money(cls, user_qq: int, group_id: int, itype: str, count: int) -> bool:
|
||||
"""
|
||||
说明:
|
||||
添加用户输赢金钱
|
||||
参数:
|
||||
:param user_qq: qq号
|
||||
:param group_id: 群号
|
||||
:param itype: 输或赢 'win' or 'lose'
|
||||
:param count: 金钱数量
|
||||
"""
|
||||
try:
|
||||
user = (
|
||||
await cls.query.where(
|
||||
(cls.user_qq == user_qq) & (cls.group_id == group_id)
|
||||
)
|
||||
.with_for_update()
|
||||
.gino.first()
|
||||
)
|
||||
if not user:
|
||||
user = await cls.create(user_qq=user_qq, group_id=group_id)
|
||||
if itype == "win":
|
||||
await user.update(
|
||||
make_money=user.make_money + count,
|
||||
).apply()
|
||||
elif itype == "lose":
|
||||
await user.update(
|
||||
lose_money=user.lose_money + count,
|
||||
).apply()
|
||||
return True
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
async def get_all_user(cls, group_id: int) -> List["RussianUser"]:
|
||||
"""
|
||||
说明:
|
||||
获取该群所有用户对象
|
||||
参数:
|
||||
:param group_id: 群号
|
||||
"""
|
||||
users = await cls.query.where((cls.group_id == group_id)).gino.all()
|
||||
return users
|
||||
Reference in New Issue
Block a user