Config提供type字段确定配置项类型

This commit is contained in:
HibiKier
2023-02-26 22:17:26 +08:00
parent a63fda8a0d
commit 8133b61ebd
53 changed files with 1589 additions and 1000 deletions
+10 -2
View File
@@ -1,3 +1,5 @@
from typing import List
from nonebot import on_message
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageEvent
from nonebot.rule import to_me
@@ -22,12 +24,18 @@ __plugin_settings__ = {
"cmd": ["Ai", "ai", "AI", "aI"],
}
__plugin_configs__ = {
"TL_KEY": {"value": [], "help": "图灵Key"},
"ALAPI_AI_CHECK": {"value": False, "help": "是否检测青云客骂娘回复", "default_value": False},
"TL_KEY": {"value": [], "help": "图灵Key", "type": List[str]},
"ALAPI_AI_CHECK": {
"value": False,
"help": "是否检测青云客骂娘回复",
"default_value": False,
"type": bool,
},
"TEXT_FILTER": {
"value": ["鸡", "口交"],
"help": "文本过滤器,将敏感词更改为*",
"default_value": [],
"type": List[str],
},
}
Config.add_plugin_config(
+5 -8
View File
@@ -1,14 +1,11 @@
from configs.config import Config
from pathlib import Path
import nonebot
from configs.config import Config
Config.add_plugin_config(
"alapi",
"ALAPI_TOKEN",
None,
help_="在https://admin.alapi.cn/user/login登录后获取token"
"alapi", "ALAPI_TOKEN", None, help_="在https://admin.alapi.cn/user/login登录后获取token"
)
nonebot.load_plugins("plugins/alapi")
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
+3
View File
@@ -55,16 +55,19 @@ __plugin_configs__ = {
"value": 5,
"help": "群内bilibili订阅需要管理的权限",
"default_value": 5,
"type": int,
},
"LIVE_MSG_AT_ALL": {
"value": False,
"help": "直播提醒是否AT全体(仅在真寻是管理员时生效)",
"default_value": False,
"type": bool,
},
"UP_MSG_AT_ALL": {
"value": False,
"help": "UP动态投稿提醒是否AT全体(仅在真寻是管理员时生效)",
"default_value": False,
"type": bool,
},
}
+16 -3
View File
@@ -1,5 +1,5 @@
from datetime import datetime
from typing import Any, Tuple
from typing import Any, List, Tuple
from nonebot import on_command, on_message, on_regex
from nonebot.adapters.onebot.v11 import (
@@ -56,7 +56,13 @@ __plugin_settings__ = {
Config.add_plugin_config(
"black_word", "CYCLE_DAYS", 30, name="敏感词检测与惩罚", help_="黑名单词汇记录周期", default_value=30
"black_word",
"CYCLE_DAYS",
30,
name="敏感词检测与惩罚",
help_="黑名单词汇记录周期",
default_value=30,
type=int,
)
Config.add_plugin_config(
@@ -65,10 +71,11 @@ Config.add_plugin_config(
[5, 1, 1, 1, 1],
help_="各个级别惩罚的容忍次数,依次为:1, 2, 3, 4, 5",
default_value=[5, 1, 1, 1, 1],
type=List[int],
)
Config.add_plugin_config(
"black_word", "AUTO_PUNISH", True, help_="是否启动自动惩罚机制", default_value=True
"black_word", "AUTO_PUNISH", True, help_="是否启动自动惩罚机制", default_value=True, type=bool
)
# Config.add_plugin_config(
@@ -81,6 +88,7 @@ Config.add_plugin_config(
360,
help_="Union[int, List[int, int]]Ban时长(分钟),四级惩罚,可以为指定数字或指定列表区间(随机),例如 [30, 360]",
default_value=360,
type=int,
)
Config.add_plugin_config(
@@ -89,6 +97,7 @@ Config.add_plugin_config(
7,
help_="Union[int, List[int, int]]Ban时长(天),三级惩罚,可以为指定数字或指定列表区间(随机),例如 [7, 30]",
default_value=360,
type=int,
)
Config.add_plugin_config(
@@ -105,6 +114,7 @@ Config.add_plugin_config(
True,
help_="自动提级机制,当周期内处罚次数大于某一特定值就提升惩罚等级",
default_value=True,
type=bool,
)
Config.add_plugin_config(
@@ -113,6 +123,7 @@ Config.add_plugin_config(
3,
help_="在CYCLE_DAYS周期内触发指定惩罚次数后提升惩罚等级",
default_value=3,
type=int,
)
Config.add_plugin_config(
@@ -121,6 +132,7 @@ Config.add_plugin_config(
False,
help_="当未检测到已收录的敏感词时,开启ALAPI文本检测并将疑似文本发送给超级用户",
default_value=False,
type=bool,
)
Config.add_plugin_config(
@@ -129,6 +141,7 @@ Config.add_plugin_config(
True,
help_="当文本包含任意敏感词时,停止向下级插件传递,即不触发ai",
default_value=True,
type=bool,
)
message_matcher = on_message(priority=1, block=False)
+11 -7
View File
@@ -1,13 +1,16 @@
from nonebot import on_command
from .data_source import get_bt_info
from services.log import logger
from nonebot.adapters.onebot.v11 import PrivateMessageEvent, Message
from nonebot.adapters.onebot.v11.permission import PRIVATE
from asyncio.exceptions import TimeoutError
from utils.utils import is_number
from nonebot.params import CommandArg, ArgStr
from nonebot import on_command
from nonebot.adapters.onebot.v11 import Message, PrivateMessageEvent
from nonebot.adapters.onebot.v11.permission import PRIVATE
from nonebot.params import ArgStr, CommandArg
from nonebot.typing import T_State
from services.log import logger
from utils.utils import is_number
from .data_source import get_bt_info
__zx_plugin_name__ = "磁力搜索"
__plugin_usage__ = """
usage:
@@ -34,6 +37,7 @@ __plugin_configs__ = {
"value": 10,
"help": "单次BT搜索返回最大消息数量",
"default_value": 10,
"type": int,
}
}
+19 -17
View File
@@ -1,16 +1,18 @@
from nonebot.adapters.onebot.v11 import Bot, MessageEvent
from nonebot.permission import SUPERUSER
from nonebot import on_command
from .data_source import check_update, get_latest_version_data
from services.log import logger
from utils.utils import scheduler, get_bot
from pathlib import Path
from configs.config import NICKNAME, Config
from nonebot.rule import to_me
from nonebot.params import ArgStr
import platform
import os
import platform
from pathlib import Path
from nonebot import on_command
from nonebot.adapters.onebot.v11 import Bot, MessageEvent
from nonebot.params import ArgStr
from nonebot.permission import SUPERUSER
from nonebot.rule import to_me
from configs.config import NICKNAME, Config
from services.log import logger
from utils.utils import get_bot, scheduler
from .data_source import check_update, get_latest_version_data
__zx_plugin_name__ = "自动更新 [Superuser]"
__plugin_usage__ = """
@@ -29,12 +31,14 @@ __plugin_configs__ = {
"value": True,
"help": "真寻是否检测版本状态",
"default": True,
"type": bool,
},
"AUTO_UPDATE_ZHENXUN": {
"value": False,
"help": "真寻是否自动检查更新",
"default": False,
}
"type": bool,
},
}
update_zhenxun = on_command("检查更新真寻", permission=SUPERUSER, priority=1, block=True)
@@ -66,9 +70,7 @@ async def _(bot: Bot, event: MessageEvent):
)
else:
if code == 200:
await bot.send_private_msg(
user_id=event.user_id, message=f"更新完毕,请重启真寻...."
)
await bot.send_private_msg(user_id=event.user_id, message=f"更新完毕,请重启真寻....")
@restart.got("flag", prompt=f"确定是否重启{NICKNAME}?确定请回复[是|好|确定](重启失败咱们将失去联系,请谨慎!)")
@@ -78,6 +80,7 @@ async def _(flag: str = ArgStr("flag")):
open("is_restart", "w")
if str(platform.system()).lower() == "windows":
import sys
python = sys.executable
os.execl(python, python, *sys.argv)
else:
@@ -109,8 +112,7 @@ async def _():
bot = get_bot()
await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]),
message=f"检测到真寻版本更新\n"
f"当前版本:{_version},最新版本:{latest_version}",
message=f"检测到真寻版本更新\n" f"当前版本:{_version},最新版本:{latest_version}",
)
if Config.get_config("check_zhenxun_update", "AUTO_UPDATE_ZHENXUN"):
try:
+11 -9
View File
@@ -1,15 +1,16 @@
from typing import Tuple, Any
import time
from typing import Any, Tuple
from nonebot import on_regex
from nonebot.params import RegexGroup
from configs.path_config import TEMP_PATH
from nonebot.adapters.onebot.v11 import Bot, MessageEvent
import time
from utils.http_utils import AsyncHttpx
from utils.message_builder import image
from services.log import logger
from utils.manager import withdraw_message_manager
from nonebot.params import RegexGroup
from configs.config import Config
from configs.path_config import TEMP_PATH
from services.log import logger
from utils.http_utils import AsyncHttpx
from utils.manager import withdraw_message_manager
from utils.message_builder import image
__zx_plugin_name__ = "coser"
__plugin_usage__ = """
@@ -35,6 +36,7 @@ __plugin_configs__ = {
"value": (0, 1),
"help": "自动撤回,参1:延迟撤回色图时间(秒),0 为关闭 | 参2:监控聊天类型,0(私聊) 1(群聊) 2(群聊+私聊)",
"default_value": (0, 1),
"type": Tuple[int, int],
},
}
@@ -49,7 +51,7 @@ url = "https://picture.yinux.workers.dev"
async def _(event: MessageEvent, reg_group: Tuple[Any, ...] = RegexGroup()):
num = reg_group[0] or 1
for _ in range(int(num)):
path = TEMP_PATH / f'cos_cc{int(time.time())}.jpeg'
path = TEMP_PATH / f"cos_cc{int(time.time())}.jpeg"
try:
await AsyncHttpx.download_file(url, path)
msg_id = await coser.send(image(path))
+19 -5
View File
@@ -1,9 +1,11 @@
import nonebot
from pathlib import Path
import nonebot
from nonebot.log import logger
from pydantic import BaseModel, Extra, ValidationError
from configs.config import Config as AConfig
from configs.path_config import IMAGE_PATH, DATA_PATH
from configs.path_config import DATA_PATH, IMAGE_PATH
try:
import ujson as json
@@ -147,9 +149,20 @@ for game_flag, game_name in zip(
"FGO_FLAG",
"ONMYOJI_FLAG",
"PCR_TAI",
"BA_FLAG"
"BA_FLAG",
],
[
"明日方舟",
"原神",
"赛马娘",
"坎公骑冠剑",
"公主连结",
"碧蓝航线",
"命运-冠位指定(FGO)",
"阴阳师",
"pcr台服卡池",
"碧蓝档案",
],
["明日方舟", "原神", "赛马娘", "坎公骑冠剑", "公主连结", "碧蓝航线", "命运-冠位指定(FGO)", "阴阳师", "pcr台服卡池", "碧蓝档案"],
):
AConfig.add_plugin_config(
"draw_card",
@@ -158,9 +171,10 @@ for game_flag, game_name in zip(
name="游戏抽卡",
help_=f"{game_name} 抽卡开关",
default_value=True,
type=bool,
)
AConfig.add_plugin_config(
"draw_card", "SEMAPHORE", 5, help_=f"异步数据下载数量限制", default_value=5
"draw_card", "SEMAPHORE", 5, help_=f"异步数据下载数量限制", default_value=5, type=int
)
+8 -5
View File
@@ -1,11 +1,13 @@
from nonebot import on_regex
from services.log import logger
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, MessageEvent
from nonebot.typing import T_State
from utils.utils import scheduler, get_bot
from .data_source import get_epic_free
from utils.manager import group_manager
from configs.config import Config
from services.log import logger
from utils.manager import group_manager
from utils.utils import get_bot, scheduler
from .data_source import get_epic_free
__zx_plugin_name__ = "epic免费游戏"
__plugin_usage__ = """
@@ -31,6 +33,7 @@ Config.add_plugin_config(
True,
help_="被动 epic免费游戏 进群默认开关状态",
default_value=True,
type=bool,
)
epic = on_regex("^epic$", priority=5, block=True)
+20 -19
View File
@@ -1,16 +1,16 @@
from utils.image_utils import get_img_hash
from nonebot.adapters.onebot.v11.permission import GROUP
from configs.path_config import TEMP_PATH
import random
from utils.message_builder import image
from nonebot import on_message
from utils.utils import get_message_img, get_message_text
from nonebot.adapters.onebot.v11 import GroupMessageEvent
from configs.config import Config
from utils.http_utils import AsyncHttpx
from services.log import logger
from configs.config import NICKNAME
from nonebot import on_message
from nonebot.adapters.onebot.v11 import GroupMessageEvent
from nonebot.adapters.onebot.v11.permission import GROUP
from configs.config import NICKNAME, Config
from configs.path_config import TEMP_PATH
from services.log import logger
from utils.http_utils import AsyncHttpx
from utils.image_utils import get_img_hash
from utils.message_builder import image
from utils.utils import get_message_img, get_message_text
__zx_plugin_name__ = "复读"
__plugin_usage__ = """
@@ -23,14 +23,15 @@ __plugin_version__ = 0.1
__plugin_author__ = "HibiKier"
__plugin_task__ = {"fudu": "复读"}
__plugin_configs__ = {
"FUDU_PROBABILITY": {"value": 0.7, "help": "复读概率", "default_value": 0.7}
"FUDU_PROBABILITY": {
"value": 0.7,
"help": "复读概率",
"default_value": 0.7,
"type": float,
}
}
Config.add_plugin_config(
"_task",
"DEFAULT_FUDU",
True,
help_="被动 复读 进群默认开关状态",
default_value=True,
"_task", "DEFAULT_FUDU", True, help_="被动 复读 进群默认开关状态", default_value=True, type=bool
)
@@ -90,7 +91,7 @@ async def _(event: GroupMessageEvent):
if not img and not msg:
return
if img:
img_hash = await get_fudu_img_hash(img[0],event.group_id)
img_hash = await get_fudu_img_hash(img[0], event.group_id)
else:
img_hash = ""
add_msg = msg + "|-|" + img_hash
@@ -107,7 +108,7 @@ async def _(event: GroupMessageEvent):
) and not _fudu_list.is_repeater(event.group_id):
if random.random() < 0.2:
if msg.endswith("打断施法!"):
await fudu.finish("[[_task|fudu]]打断" + msg)
await fudu.finish("[[_task|fudu]]打断" + msg)
else:
await fudu.finish("[[_task|fudu]]打断施法!")
_fudu_list.set_repeater(event.group_id)
+4 -2
View File
@@ -1,7 +1,8 @@
from configs.config import Config
from configs.path_config import IMAGE_PATH
from nonebot import on_command
from nonebot.adapters.onebot.v11 import GroupMessageEvent, MessageEvent
from configs.config import Config
from configs.path_config import IMAGE_PATH
from services.log import logger
from utils.manager import group_manager
from utils.message_builder import image
@@ -35,6 +36,7 @@ Config.add_plugin_config(
True,
help_="被动 原神黄历提醒 进群默认开关状态",
default_value=True,
type=bool,
)
almanac = on_command("原神黄历", priority=5, block=True)
@@ -37,11 +37,13 @@ __plugin_configs__ = {
"value": True,
"help": "当请求连续三次失败时,关闭用户的树脂提醒",
"default_value": True,
"type": bool,
},
"CUSTOM_RESIN_OVERFLOW_REMIND": {
"value": 20,
"help": "自定义树脂溢出指定数量时的提醒,空值是为关闭",
"default_value": None,
"type": int,
},
}
+12 -4
View File
@@ -1,8 +1,10 @@
from configs.config import Config
from configs.path_config import IMAGE_PATH
from pathlib import Path
from typing import List, Tuple
import nonebot
from configs.config import Config
from configs.path_config import IMAGE_PATH
Config.add_plugin_config(
"image_management",
@@ -11,6 +13,7 @@ Config.add_plugin_config(
name="图库操作",
help_="公开图库列表,可自定义添加 [如果含有send_setu插件,请不要添加色图库]",
default_value=[],
type=List[str],
)
Config.add_plugin_config(
@@ -20,6 +23,7 @@ Config.add_plugin_config(
name="图库操作",
help_="自动撤回,参1:延迟撤回发送图库图片的时间(秒),0 为关闭 | 参2:监控聊天类型,0(私聊) 1(群聊) 2(群聊+私聊)",
default_value=(0, 1),
type=Tuple[int, int],
)
Config.add_plugin_config(
@@ -28,6 +32,7 @@ Config.add_plugin_config(
7,
help_="删除图库图片需要的管理员等级",
default_value=7,
type=int,
)
Config.add_plugin_config(
@@ -36,6 +41,7 @@ Config.add_plugin_config(
7,
help_="移动图库图片需要的管理员等级",
default_value=7,
type=int,
)
Config.add_plugin_config(
@@ -44,6 +50,7 @@ Config.add_plugin_config(
6,
help_="上传图库图片需要的管理员等级",
default_value=6,
type=int,
)
Config.add_plugin_config(
@@ -51,11 +58,12 @@ Config.add_plugin_config(
"SHOW_ID",
True,
help_="是否消息显示图片下标id",
default_value=True
default_value=True,
type=bool,
)
(IMAGE_PATH / "image_management").mkdir(parents=True, exist_ok=True)
nonebot.load_plugins("plugins/image_management")
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
@@ -13,11 +13,6 @@ from utils.utils import FreqLimiter, cn2py, get_message_text, is_number
from .rule import rule
try:
import ujson as json
except ModuleNotFoundError:
import json
__zx_plugin_name__ = "本地图库"
__plugin_usage__ = f"""
usage:
@@ -36,16 +31,12 @@ __plugin_settings__ = {
"level": 5,
"default_status": True,
"limit_superuser": False,
"cmd": ["发送图片"] + Config.get_config("image_management", "IMAGE_DIR_LIST"),
"cmd": ["发送图片"] + (Config.get_config("image_management", "IMAGE_DIR_LIST") or []),
}
__plugin_resources__ = {"pa": IMAGE_PATH / "pa"}
Config.add_plugin_config(
"_task",
"DEFAULT_PA",
True,
help_="被动 爬 进群默认开关状态",
default_value=True,
"_task", "DEFAULT_PA", True, help_="被动 爬 进群默认开关状态", default_value=True, type=int
)
_flmt = FreqLimiter(1)
+33 -14
View File
@@ -1,19 +1,20 @@
import time
from io import BytesIO
from typing import Any, Dict, Tuple
import imagehash
from PIL import Image
from nonebot import on_message, on_command
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, ActionFailed
from nonebot import on_command, on_message
from nonebot.adapters.onebot.v11 import ActionFailed, Bot, GroupMessageEvent, Message
from nonebot.adapters.onebot.v11.permission import GROUP
from utils.utils import is_number, get_message_img, get_message_text
from configs.path_config import DATA_PATH, TEMP_PATH
from utils.image_utils import get_img_hash
from services.log import logger
from nonebot.params import Command, CommandArg
from PIL import Image
from configs.config import NICKNAME, Config
from configs.path_config import DATA_PATH, TEMP_PATH
from services.log import logger
from utils.http_utils import AsyncHttpx
from nonebot.params import CommandArg, Command
from typing import Tuple, Dict, Any
import time
from utils.image_utils import get_img_hash
from utils.utils import get_message_img, get_message_text, is_number
try:
import ujson as json
@@ -38,13 +39,29 @@ __plugin_version__ = 0.1
__plugin_author__ = "HibiKier"
__plugin_settings__ = {"admin_level": Config.get_config("mute", "MUTE_LEVEL")}
__plugin_configs__ = {
"MUTE_LEVEL [LEVEL]": {"value": 5, "help": "更改禁言设置的管理权限", "default_value": 5},
"MUTE_DEFAULT_COUNT": {"value": 10, "help": "刷屏禁言默认检测次数", "default_value": 10},
"MUTE_DEFAULT_TIME": {"value": 7, "help": "刷屏检测默认规定时间", "default_value": 7},
"MUTE_LEVEL [LEVEL]": {
"value": 5,
"help": "更改禁言设置的管理权限",
"default_value": 5,
"type": int,
},
"MUTE_DEFAULT_COUNT": {
"value": 10,
"help": "刷屏禁言默认检测次数",
"default_value": 10,
"type": int,
},
"MUTE_DEFAULT_TIME": {
"value": 7,
"help": "刷屏检测默认规定时间",
"default_value": 7,
"type": int,
},
"MUTE_DEFAULT_DURATION": {
"value": 10,
"help": "刷屏检测默禁言时长(分钟)",
"default_value": 10,
"type": int,
},
}
@@ -75,7 +92,9 @@ def save_data():
async def download_img_and_hash(url) -> str:
return str(imagehash.average_hash(Image.open(BytesIO((await AsyncHttpx.get(url)).content))))
return str(
imagehash.average_hash(Image.open(BytesIO((await AsyncHttpx.get(url)).content)))
)
mute_dict = {}
+46 -30
View File
@@ -1,24 +1,27 @@
from typing import Type, Tuple, Any
from nonebot import on_command
from nonebot.matcher import Matcher
from utils.utils import scheduler, is_number
from nonebot.adapters.onebot.v11.permission import GROUP
from nonebot.typing import T_State
from nonebot.adapters.onebot.v11 import GroupMessageEvent, MessageEvent, Message
from nonebot.permission import SUPERUSER
import random
from nonebot.plugin import MatcherGroup
from configs.path_config import IMAGE_PATH
from typing import Any, Tuple, Type
from nonebot import on_command
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message, MessageEvent
from nonebot.adapters.onebot.v11.permission import GROUP
from nonebot.matcher import Matcher
from nonebot.params import CommandArg, RegexGroup
from nonebot.permission import SUPERUSER
from nonebot.plugin import MatcherGroup
from nonebot.typing import T_State
from configs.config import Config
from configs.path_config import IMAGE_PATH
from utils.utils import is_number, scheduler
from .open_cases_c import (
open_case,
total_open_statistics,
group_statistics,
my_knifes_name,
open_shilian_case,
open_case,
open_multiple_case,
total_open_statistics,
)
from .utils import util_get_buff_price, util_get_buff_img, update_count_daily
from configs.config import Config
from .utils import reset_count_daily, util_get_buff_img, util_get_buff_price
__zx_plugin_name__ = "开箱"
__plugin_usage__ = """
@@ -73,11 +76,17 @@ __plugin_task__ = {"open_case_reset_remind": "每日开箱重置提醒"}
__plugin_cd_limit__ = {"rst": "着什么急啊,慢慢来!"}
__plugin_resources__ = {f"cases": IMAGE_PATH}
__plugin_configs__ = {
"INITIAL_OPEN_CASE_COUNT": {"value": 20, "help": "初始每日开箱次数", "default_value": 20},
"INITIAL_OPEN_CASE_COUNT": {
"value": 20,
"help": "初始每日开箱次数",
"default_value": 20,
"type": int,
},
"EACH_IMPRESSION_ADD_COUNT": {
"value": 3,
"help": "每 * 点好感度额外增加开箱次数",
"default_value": 3,
"type": int,
},
"COOKIE": {
"value": None,
@@ -92,6 +101,7 @@ Config.add_plugin_config(
True,
help_="被动 每日开箱重置提醒 进群默认开关状态",
default_value=True,
type=int,
)
cases_name = ["狂牙大行动", "突围大行动", "命悬一线", "裂空", "光谱"]
@@ -101,12 +111,12 @@ cases_matcher_group = MatcherGroup(priority=5, permission=GROUP, block=True)
k_open_case = cases_matcher_group.on_command("开箱")
reload_count = cases_matcher_group.on_command("重置开箱",permission=SUPERUSER)
reload_count = cases_matcher_group.on_command("重置开箱", permission=SUPERUSER)
@reload_count.handle()
async def _(event: GroupMessageEvent):
await update_count_daily()
await reset_count_daily()
@k_open_case.handle()
@@ -153,11 +163,13 @@ async def _(event: GroupMessageEvent):
)
open_shilian: Type[Matcher] = cases_matcher_group.on_regex("(.*)连开箱(.*)?")
open_multiple: Type[Matcher] = cases_matcher_group.on_regex("(.*)连开箱(.*)?")
@open_shilian.handle()
async def _(event: GroupMessageEvent, state: T_State, reg_group: Tuple[Any, ...] = RegexGroup()):
@open_multiple.handle()
async def _(
event: GroupMessageEvent, state: T_State, reg_group: Tuple[Any, ...] = RegexGroup()
):
num, case_name = reg_group
if is_number(num) or num_dict.get(num):
try:
@@ -165,18 +177,18 @@ async def _(event: GroupMessageEvent, state: T_State, reg_group: Tuple[Any, ...]
except KeyError:
num = int(num)
if num > 30:
await open_shilian.finish("开箱次数不要超过30啊笨蛋!", at_sender=True)
await open_multiple.finish("开箱次数不要超过30啊笨蛋!", at_sender=True)
if num < 0:
await open_shilian.finish("再负开箱就扣你明天开箱数了!", at_sender=True)
await open_multiple.finish("再负开箱就扣你明天开箱数了!", at_sender=True)
else:
await open_shilian.finish("必须要是数字切不要超过30啊笨蛋!中文也可!", at_sender=True)
await open_multiple.finish("必须要是数字切不要超过30啊笨蛋!中文也可!", at_sender=True)
case_name = case_name.replace("武器箱", "").strip()
if not case_name:
case_name = random.choice(cases_name)
elif case_name not in cases_name:
await open_shilian.finish("武器箱未收录!", at_sender=True)
await open_shilian.finish(
await open_shilian_case(event.user_id, event.group_id, case_name, num),
await open_multiple.finish("武器箱未收录!", at_sender=True)
await open_multiple.finish(
await open_multiple_case(event.user_id, event.group_id, case_name, num),
at_sender=True,
)
@@ -220,7 +232,9 @@ update_price = on_command("更新开箱价格", priority=1, permission=SUPERUSER
@update_price.handle()
async def _(event: MessageEvent, arg: Message = CommandArg()):
await update_price.send(await util_get_buff_price(arg.extract_plain_text().strip() or "狂牙大行动"))
await update_price.send(
await util_get_buff_price(arg.extract_plain_text().strip() or "狂牙大行动")
)
update_img = on_command("更新开箱图片", priority=1, permission=SUPERUSER, block=True)
@@ -228,7 +242,9 @@ update_img = on_command("更新开箱图片", priority=1, permission=SUPERUSER,
@update_img.handle()
async def _(event: MessageEvent, arg: Message = CommandArg()):
await update_img.send(await util_get_buff_img(arg.extract_plain_text().strip() or "狂牙大行动"))
await update_img.send(
await util_get_buff_img(arg.extract_plain_text().strip() or "狂牙大行动")
)
# 重置开箱
@@ -238,4 +254,4 @@ async def _(event: MessageEvent, arg: Message = CommandArg()):
minute=1,
)
async def _():
await update_count_daily()
await reset_count_daily()
+341 -129
View File
@@ -1,5 +1,9 @@
import random
import pypinyin
from typing import List, Tuple
from services.log import logger
from .models.buff_skin import BuffSkin
BLUE = 0.7981
BLUE_ST = 0.0699
@@ -29,152 +33,360 @@ BATTLE_SCARED_S = 0.45
BATTLE_SCARED_E = 0.99999
# 狂牙大行动
KUANGYADAXINGDONG_CASE_KNIFE = ['摩托手套 | 第三特种兵连', '狂牙手套 | 翡翠', '驾驶手套 | 美洲豹女王', '运动手套 | 弹弓', '专业手套 | 老虎精英'
, '专业手套 | 渐变大理石', '运动手套 | 夜行衣', '驾驶手套 | 西装革履', '摩托手套 | 终点线', '摩托手套 | 血压',
'运动手套 | 猩红头巾', '驾驶手套 | 雪豹', '裹手 | 长颈鹿', '驾驶手套 | 绯红列赞', '裹手 | 沙漠头巾',
'专业手套 | 一线特工', '狂牙手套 | 黄色斑纹', '摩托手套 | 小心烟幕弹', '裹手 | 蟒蛇', '裹手 | 警告!',
'狂牙手套 | 精神错乱', '运动手套 | 大型猎物', '狂牙手套 | 针尖', '专业手套 | 陆军少尉长官']
KUANGYADAXINGDONG_CASE_RED = ['M4A1 | 印花集', '格洛克 | 黑色魅影']
KUANGYADAXINGDONG_CASE_PINK = ['FN57 | 童话城堡', 'M4A4 | 赛博', 'USP | 小绿怪']
KUANGYADAXINGDONG_CASE_PURPLE = ['AWP | 亡灵之主', '双持贝瑞塔 | 灾难', '新星 | 一见青心', 'SSG 08 | 抖枪', 'UMP-45 | 金铋辉煌']
KUANGYADAXINGDONG_CASE_BLUE = ['CZ75 | 世仇', 'P90 | 大怪兽RUSH', 'G3SG1 | 血腥迷彩', '加利尔 AR | 破坏者', 'P250 | 污染物',
'M249 | 等高线', 'MP5-SD | 零点行动']
KUANGYADAXINGDONG_CASE_KNIFE = [
"摩托手套 | 第三特种兵连",
"狂牙手套 | 翡翠",
"驾驶手套 | 美洲豹女王",
"运动手套 | 弹弓",
"专业手套 | 老虎精英",
"专业手套 | 渐变大理石",
"运动手套 | 夜行衣",
"驾驶手套 | 西装革履",
"摩托手套 | 终点线",
"摩托手套 | 血压",
"运动手套 | 猩红头巾",
"驾驶手套 | 雪豹",
"裹手 | 长颈鹿",
"驾驶手套 | 绯红列赞",
"裹手 | 沙漠头巾",
"专业手套 | 一线特工",
"狂牙手套 | 黄色斑纹",
"摩托手套 | 小心烟幕弹",
"裹手 | 蟒蛇",
"裹手 | 警告!",
"狂牙手套 | 精神错乱",
"运动手套 | 大型猎物",
"狂牙手套 | 针尖",
"专业手套 | 陆军少尉长官",
]
KUANGYADAXINGDONG_CASE_RED = ["M4A1 | 印花集", "格洛克 | 黑色魅影"]
KUANGYADAXINGDONG_CASE_PINK = ["FN57 | 童话城堡", "M4A4 | 赛博", "USP | 小绿怪"]
KUANGYADAXINGDONG_CASE_PURPLE = [
"AWP | 亡灵之主",
"双持贝瑞塔 | 灾难",
"新星 | 一见青心",
"SSG 08 | 抖枪",
"UMP-45 | 金铋辉煌",
]
KUANGYADAXINGDONG_CASE_BLUE = [
"CZ75 | 世仇",
"P90 | 大怪兽RUSH",
"G3SG1 | 血腥迷彩",
"加利尔 AR | 破坏者",
"P250 | 污染物",
"M249 | 等高线",
"MP5-SD | 零点行动",
]
# 突围大行动
TUWEIDAXINGDONG_CASE_KNIFE = ['蝴蝶刀 | 无涂装', '蝴蝶刀 | 蓝钢', '蝴蝶刀 | 屠夫', '蝴蝶刀 | 森林 DDPAT', '蝴蝶刀 | 北方森林',
'蝴蝶刀 | 狩猎网格', '蝴蝶刀 | 枯焦之色', '蝴蝶刀 | 人工染色', '蝴蝶刀 | 都市伪装', '蝴蝶刀 | 表面淬火',
'蝴蝶刀 | 深红之网', '蝴蝶刀 | 渐变之色', '蝴蝶刀 | 噩梦之夜']
TUWEIDAXINGDONG_CASE_RED = ['P90 | 二西莫夫', 'M4A1 | 次时代']
TUWEIDAXINGDONG_CASE_PINK = ['沙漠之鹰 | 阴谋者', 'FN57 | 狩猎利器', '格洛克 | 水灵']
TUWEIDAXINGDONG_CASE_PURPLE = ['PP-野牛 | 死亡主宰者', 'CZ75 | 猛虎', '新星 | 锦鲤', 'P250 | 超新星']
TUWEIDAXINGDONG_CASE_BLUE = ['MP7 | 都市危机', '内格夫 | 沙漠精英', 'P2000 | 乳白象牙', 'SSG 08 | 无尽深海', 'UMP-45 | 迷之宫']
TUWEIDAXINGDONG_CASE_KNIFE = [
"蝴蝶刀 | 无涂装",
"蝴蝶刀 | 蓝钢",
"蝴蝶刀 | 屠夫",
"蝴蝶刀 | 森林 DDPAT",
"蝴蝶刀 | 北方森林",
"蝴蝶刀 | 狩猎网格",
"蝴蝶刀 | 枯焦之色",
"蝴蝶刀 | 人工染色",
"蝴蝶刀 | 都市伪装",
"蝴蝶刀 | 表面淬火",
"蝴蝶刀 | 深红之网",
"蝴蝶刀 | 渐变之色",
"蝴蝶刀 | 噩梦之夜",
]
TUWEIDAXINGDONG_CASE_RED = ["P90 | 二西莫夫", "M4A1 | 次时代"]
TUWEIDAXINGDONG_CASE_PINK = ["沙漠之鹰 | 阴谋者", "FN57 | 狩猎利器", "格洛克 | 水灵"]
TUWEIDAXINGDONG_CASE_PURPLE = ["PP-野牛 | 死亡主宰者", "CZ75 | 猛虎", "新星 | 锦鲤", "P250 | 超新星"]
TUWEIDAXINGDONG_CASE_BLUE = [
"MP7 | 都市危机",
"内格夫 | 沙漠精英",
"P2000 | 乳白象牙",
"SSG 08 | 无尽深海",
"UMP-45 | 迷之宫",
]
# 命悬一线
MINGXUANYIXIAN_CASE_KNIFE = ['专业手套 | 大腕', '专业手套 | 深红之网', '专业手套 | 渐变之色', '专业手套 | 狩鹿', '九头蛇手套 | 响尾蛇',
'九头蛇手套 | 红树林', '九头蛇手套 | 翡翠色调', '九头蛇手套 | 表面淬火', '摩托手套 | 交运', '摩托手套 | 嘭!',
'摩托手套 | 多边形', '摩托手套 | 玳瑁', '裹手 | 套印', '裹手 | 森林色调', '裹手 | 钴蓝骷髅', '裹手 | 防水布胶带',
'运动手套 | 双栖', '运动手套 | 欧米伽', '运动手套 | 迈阿密风云', '运动手套 | 青铜形态', '驾驶手套 | 墨绿色调',
'驾驶手套 | 王蛇', '驾驶手套 | 蓝紫格子', '驾驶手套 | 超越']
MINGXUANYIXIAN_CASE_RED = ['M4A4 | 黑色魅影', 'MP7 | 血腥运动']
MINGXUANYIXIAN_CASE_PINK = ['AUG | 湖怪鸟', 'AWP | 死神', 'USP | 脑洞大开']
MINGXUANYIXIAN_CASE_PURPLE = ['MAG-7 | SWAG-7', 'UMP-45 | 白狼', '内格夫 | 狮子鱼', '新星 | 狂野六号', '格洛克 | 城里的月光']
MINGXUANYIXIAN_CASE_BLUE = ['FN57 | 焰色反应', 'MP9 | 黑砂', 'P2000 | 都市危机', 'PP-野牛 | 黑夜暴乱', 'R8 左轮手枪 | 稳',
'SG 553 | 阿罗哈', 'XM1014 | 锈蚀烈焰']
MINGXUANYIXIAN_CASE_KNIFE = [
"专业手套 | 大腕",
"专业手套 | 深红之网",
"专业手套 | 渐变之色",
"专业手套 | 狩鹿",
"九头蛇手套 | 响尾蛇",
"九头蛇手套 | 红树林",
"九头蛇手套 | 翡翠色调",
"九头蛇手套 | 表面淬火",
"摩托手套 | 交运",
"摩托手套 | 嘭!",
"摩托手套 | 多边形",
"摩托手套 | 玳瑁",
"裹手 | 套印",
"裹手 | 森林色调",
"裹手 | 钴蓝骷髅",
"裹手 | 防水布胶带",
"运动手套 | 双栖",
"运动手套 | 欧米伽",
"运动手套 | 迈阿密风云",
"运动手套 | 青铜形态",
"驾驶手套 | 墨绿色调",
"驾驶手套 | 王蛇",
"驾驶手套 | 蓝紫格子",
"驾驶手套 | 超越",
]
MINGXUANYIXIAN_CASE_RED = ["M4A4 | 黑色魅影", "MP7 | 血腥运动"]
MINGXUANYIXIAN_CASE_PINK = ["AUG | 湖怪鸟", "AWP | 死神", "USP | 脑洞大开"]
MINGXUANYIXIAN_CASE_PURPLE = [
"MAG-7 | SWAG-7",
"UMP-45 | 白狼",
"内格夫 | 狮子鱼",
"新星 | 狂野六号",
"格洛克 | 城里的月光",
]
MINGXUANYIXIAN_CASE_BLUE = [
"FN57 | 焰色反应",
"MP9 | 黑砂",
"P2000 | 都市危机",
"PP-野牛 | 黑夜暴乱",
"R8 左轮手枪 | 稳",
"SG 553 | 阿罗哈",
"XM1014 | 锈蚀烈焰",
]
LIEKONG_CASE_KNIFE = ['求生匕首 | 无涂装', '求生匕首 | 人工染色', '求生匕首 | 北方森林', '求生匕首 | 夜色', '求生匕首 | 屠夫',
'求生匕首 | 枯焦之色', '求生匕首 | 森林 DDPAT', '求生匕首 | 深红之网', '求生匕首 | 渐变之色', '求生匕首 | 狩猎网格',
'求生匕首 | 蓝钢', '求生匕首 | 表面淬火', '求生匕首 | 都市伪装', '流浪者匕首 | 无涂装', '流浪者匕首 | 人工染色',
'流浪者匕首 | 北方森林', '流浪者匕首 | 夜色', '流浪者匕首 | 屠夫', '流浪者匕首 | 枯焦之色', '流浪者匕首 | 森林 DDPAT',
'流浪者匕首 | 深红之网', '流浪者匕首 | 渐变之色', '流浪者匕首 | 狩猎网格', '流浪者匕首 | 蓝钢', '流浪者匕首 | 表面淬火',
'流浪者匕首 | 都市伪装', '系绳匕首 | 无涂装', '系绳匕首 | 人工染色', '系绳匕首 | 北方森林', '系绳匕首 | 夜色',
'系绳匕首 | 屠夫', '系绳匕首 | 枯焦之色', '系绳匕首 | 森林 DDPAT', '系绳匕首 | 深红之网', '系绳匕首 | 渐变之色',
'系绳匕首 | 狩猎网格', '系绳匕首 | 蓝钢', '系绳匕首 | 表面淬火', '系绳匕首 | 都市伪装', '骷髅匕首 | 无涂装',
'骷髅匕首 | 人工染色', '骷髅匕首 | 北方森林', '骷髅匕首 | 夜色', '骷髅匕首 | 屠夫', '骷髅匕首 | 枯焦之色',
'骷髅匕首 | 森林 DDPAT', '骷髅匕首 | 深红之网', '骷髅匕首 | 渐变之色', '骷髅匕首 | 狩猎网格', '骷髅匕首 | 蓝钢',
'骷髅匕首 | 表面淬火', '骷髅匕首 | 都市伪装']
LIEKONG_CASE_RED = ['AK-47 | 阿努比斯军团', '沙漠之鹰 | 印花集']
LIEKONG_CASE_PINK = ['M4A4 | 齿仙', 'XM1014 | 埋葬之影', '格洛克 | 摩登时代']
LIEKONG_CASE_PURPLE = ['加利尔 AR | 凤凰商号', 'Tec-9 | 兄弟连', 'MP5-SD | 猛烈冲锋', 'MAG-7 | 北冥有鱼', 'MAC-10 | 魅惑']
LIEKONG_CASE_BLUE = ['内格夫 | 飞羽', 'SSG 08 | 主机001', 'SG 553 | 锈蚀之刃', 'PP-野牛 | 神秘碑文', 'P90 | 集装箱', 'P250 | 卡带',
'P2000 | 盘根错节']
LIEKONG_CASE_KNIFE = [
"求生匕首 | 无涂装",
"求生匕首 | 人工染色",
"求生匕首 | 北方森林",
"求生匕首 | 夜色",
"求生匕首 | 屠夫",
"求生匕首 | 枯焦之色",
"求生匕首 | 森林 DDPAT",
"求生匕首 | 深红之网",
"求生匕首 | 渐变之色",
"求生匕首 | 狩猎网格",
"求生匕首 | 蓝钢",
"求生匕首 | 表面淬火",
"求生匕首 | 都市伪装",
"流浪者匕首 | 无涂装",
"流浪者匕首 | 人工染色",
"流浪者匕首 | 北方森林",
"流浪者匕首 | 夜色",
"流浪者匕首 | 屠夫",
"流浪者匕首 | 枯焦之色",
"流浪者匕首 | 森林 DDPAT",
"流浪者匕首 | 深红之网",
"流浪者匕首 | 渐变之色",
"流浪者匕首 | 狩猎网格",
"流浪者匕首 | 蓝钢",
"流浪者匕首 | 表面淬火",
"流浪者匕首 | 都市伪装",
"系绳匕首 | 无涂装",
"系绳匕首 | 人工染色",
"系绳匕首 | 北方森林",
"系绳匕首 | 夜色",
"系绳匕首 | 屠夫",
"系绳匕首 | 枯焦之色",
"系绳匕首 | 森林 DDPAT",
"系绳匕首 | 深红之网",
"系绳匕首 | 渐变之色",
"系绳匕首 | 狩猎网格",
"系绳匕首 | 蓝钢",
"系绳匕首 | 表面淬火",
"系绳匕首 | 都市伪装",
"骷髅匕首 | 无涂装",
"骷髅匕首 | 人工染色",
"骷髅匕首 | 北方森林",
"骷髅匕首 | 夜色",
"骷髅匕首 | 屠夫",
"骷髅匕首 | 枯焦之色",
"骷髅匕首 | 森林 DDPAT",
"骷髅匕首 | 深红之网",
"骷髅匕首 | 渐变之色",
"骷髅匕首 | 狩猎网格",
"骷髅匕首 | 蓝钢",
"骷髅匕首 | 表面淬火",
"骷髅匕首 | 都市伪装",
]
LIEKONG_CASE_RED = ["AK-47 | 阿努比斯军团", "沙漠之鹰 | 印花集"]
LIEKONG_CASE_PINK = ["M4A4 | 齿仙", "XM1014 | 埋葬之影", "格洛克 | 摩登时代"]
LIEKONG_CASE_PURPLE = [
"加利尔 AR | 凤凰商号",
"Tec-9 | 兄弟连",
"MP5-SD | 猛烈冲锋",
"MAG-7 | 北冥有鱼",
"MAC-10 | 魅惑",
]
LIEKONG_CASE_BLUE = [
"内格夫 | 飞羽",
"SSG 08 | 主机001",
"SG 553 | 锈蚀之刃",
"PP-野牛 | 神秘碑文",
"P90 | 集装箱",
"P250 | 卡带",
"P2000 | 盘根错节",
]
GUANGPU_CASE_KNIFE = ['弯刀 | 外表生锈', '弯刀 | 多普勒', '弯刀 | 大马士革钢', '弯刀 | 渐变大理石', '弯刀 | 致命紫罗兰', '弯刀 | 虎牙',
'暗影双匕 | 外表生锈', '暗影双匕 | 多普勒', '暗影双匕 | 大马士革钢', '暗影双匕 | 渐变大理石', '暗影双匕 | 致命紫罗兰',
'暗影双匕 | 虎牙', '猎杀者匕首 | 外表生锈', '猎杀者匕首 | 多普勒', '猎杀者匕首 | 大马士革钢', '猎杀者匕首 | 渐变大理石',
'猎杀者匕首 | 致命紫罗兰', '猎杀者匕首 | 虎牙', '蝴蝶刀 | 外表生锈', '蝴蝶刀 | 多普勒', '蝴蝶刀 | 大马士革钢',
'蝴蝶刀 | 渐变大理石', '蝴蝶刀 | 致命紫罗兰', '蝴蝶刀 | 虎牙', '鲍伊猎刀 | 外表生锈', '鲍伊猎刀 | 多普勒',
'鲍伊猎刀 | 大马士革钢', '鲍伊猎刀 | 渐变大理石', '鲍伊猎刀 | 致命紫罗兰', '鲍伊猎刀 | 虎牙']
GUANGPU_CASE_RED = ['USP | 黑色魅影', 'AK-47 | 血腥运动']
GUANGPU_CASE_PINK = ['M4A1 | 毁灭者 2000', 'CZ75 | 相柳', 'AWP | 浮生如梦']
GUANGPU_CASE_PURPLE = ['加利尔 AR | 深红海啸', 'XM1014 | 四季', 'UMP-45 | 支架', 'MAC-10 | 绝界之行', 'M249 | 翠绿箭毒蛙']
GUANGPU_CASE_BLUE = ['沙漠之鹰 | 锈蚀烈焰', '截短霰弹枪 | 梭鲈', 'SCAR-20 | 蓝图', 'PP-野牛 | 丛林滑流', 'P250 | 涟漪', 'MP7 | 非洲部落',
'FN57 | 毛细血管']
GUANGPU_CASE_KNIFE = [
"弯刀 | 外表生锈",
"弯刀 | 多普勒",
"弯刀 | 大马士革钢",
"弯刀 | 渐变大理石",
"弯刀 | 致命紫罗兰",
"弯刀 | 虎牙",
"暗影双匕 | 外表生锈",
"暗影双匕 | 多普勒",
"暗影双匕 | 大马士革钢",
"暗影双匕 | 渐变大理石",
"暗影双匕 | 致命紫罗兰",
"暗影双匕 | 虎牙",
"猎杀者匕首 | 外表生锈",
"猎杀者匕首 | 多普勒",
"猎杀者匕首 | 大马士革钢",
"猎杀者匕首 | 渐变大理石",
"猎杀者匕首 | 致命紫罗兰",
"猎杀者匕首 | 虎牙",
"蝴蝶刀 | 外表生锈",
"蝴蝶刀 | 多普勒",
"蝴蝶刀 | 大马士革钢",
"蝴蝶刀 | 渐变大理石",
"蝴蝶刀 | 致命紫罗兰",
"蝴蝶刀 | 虎牙",
"鲍伊猎刀 | 外表生锈",
"鲍伊猎刀 | 多普勒",
"鲍伊猎刀 | 大马士革钢",
"鲍伊猎刀 | 渐变大理石",
"鲍伊猎刀 | 致命紫罗兰",
"鲍伊猎刀 | 虎牙",
]
GUANGPU_CASE_RED = ["USP | 黑色魅影", "AK-47 | 血腥运动"]
GUANGPU_CASE_PINK = ["M4A1 | 毁灭者 2000", "CZ75 | 相柳", "AWP | 浮生如梦"]
GUANGPU_CASE_PURPLE = [
"加利尔 AR | 深红海啸",
"XM1014 | 四季",
"UMP-45 | 支架",
"MAC-10 | 绝界之行",
"M249 | 翠绿箭毒蛙",
]
GUANGPU_CASE_BLUE = [
"沙漠之鹰 | 锈蚀烈焰",
"截短霰弹枪 | 梭鲈",
"SCAR-20 | 蓝图",
"PP-野牛 | 丛林滑流",
"P250 | 涟漪",
"MP7 | 非洲部落",
"FN57 | 毛细血管",
]
NO_STA_KNIFE = ['求生匕首 | 北方森林', '求生匕首 | 夜色', '求生匕首 | 枯焦之色', '流浪者匕首 | 夜色', '流浪者匕首 | 枯焦之色', '流浪者匕首 | 森林 DDPAT',
'系绳匕首 | 夜色', '系绳匕首 | 狩猎网格', '骷髅匕首 | 夜色', '骷髅匕首 | 森林 DDPAT', '骷髅匕首 | 狩猎网格']
NO_STA_KNIFE = [
"求生匕首 | 北方森林",
"求生匕首 | 夜色",
"求生匕首 | 枯焦之色",
"流浪者匕首 | 夜色",
"流浪者匕首 | 枯焦之色",
"流浪者匕首 | 森林 DDPAT",
"系绳匕首 | 夜色",
"系绳匕首 | 狩猎网格",
"骷髅匕首 | 夜色",
"骷髅匕首 | 森林 DDPAT",
"骷髅匕首 | 狩猎网格",
]
def get_wear(num: float) -> str:
if num <= FACTORY_NEW_E:
def get_wear(rand: float) -> str:
"""判断磨损度
Args:
rand (float): 随机rand
Returns:
str: 磨损名称
"""
if rand <= FACTORY_NEW_E:
return "崭新出厂"
if MINIMAL_WEAR_S <= num <= MINIMAL_WEAR_E:
if MINIMAL_WEAR_S <= rand <= MINIMAL_WEAR_E:
return "略有磨损"
if FIELD_TESTED_S <= num <= FIELD_TESTED_E:
if FIELD_TESTED_S <= rand <= FIELD_TESTED_E:
return "久经沙场"
if WELL_WORN_S <= num <= WELL_WORN_E:
if WELL_WORN_S <= rand <= WELL_WORN_E:
return "破损不堪"
return "战痕累累"
def get_color_quality(rand: float, case_name: str):
case = ""
mosun = random.random()/2 + random.random()/2
for i in pypinyin.pinyin(case_name, style=pypinyin.NORMAL):
case += ''.join(i)
case = case.upper()
CASE_KNIFE = eval(case + "_CASE_KNIFE")
CASE_RED = eval(case + "_CASE_RED")
CASE_PINK = eval(case + "_CASE_PINK")
CASE_PURPLE = eval(case + "_CASE_PURPLE")
CASE_BLUE = eval(case + "_CASE_BLUE")
if rand <= KNIFE:
skin = "罕见级(金色): " + random.choice(CASE_KNIFE)
if random.random() <= KNIFE_ST and (skin[2:4] != "手套" or skin[:2] != "裹手") and skin.split(':')[1] \
not in NO_STA_KNIFE:
skin_sp = skin.split("|")
skin = skin_sp[0] + "(StatTrak™) | " + skin_sp[1]
elif KNIFE < rand <= RED:
skin = "隐秘级(红色): " + random.choice(CASE_RED)
if random.random() <= RED_ST:
skin_sp = skin.split("|")
skin = skin_sp[0] + "(StatTrak™) | " + skin_sp[1]
elif RED < rand <= PINK:
skin = "保密级(粉色): " + random.choice(CASE_PINK)
if random.random() <= PINK_ST:
skin_sp = skin.split("|")
skin = skin_sp[0] + "(StatTrak™) | " + skin_sp[1]
elif PINK < rand <= PURPLE:
skin = "受限级(紫色): " + random.choice(CASE_PURPLE)
if random.random() <= PURPLE_ST:
skin_sp = skin.split("|")
skin = skin_sp[0] + "(StatTrak™) | " + skin_sp[1]
else:
skin = "军规级(蓝色): " + random.choice(CASE_BLUE)
if random.random() <= BLUE_ST:
skin_sp = skin.split("|")
skin = skin_sp[0] + "(StatTrak™) | " + skin_sp[1]
if skin.find("(") != -1:
cpskin = skin.split(":")[1]
ybskin = cpskin.split("|")
temp_skin = ybskin[0].strip()[:-11] + " | " + ybskin[1].strip()
else:
temp_skin = skin.split(":")[1].strip()
# 崭新 -> 略磨
if temp_skin in [] or temp_skin.find('渐变之色') != -1 or temp_skin.find('多普勒') != -1 or temp_skin.find('虎牙') != -1\
or temp_skin.find('渐变大理石') != -1:
mosun = random.uniform(FACTORY_NEW_S, MINIMAL_WEAR_E) / 2 + random.uniform(FACTORY_NEW_S, MINIMAL_WEAR_E) / 2
# 崭新 -> 久经
if temp_skin in ['沙漠之鹰 | 阴谋者', '新星 | 锦鲤'] or temp_skin.find('屠夫') != -1:
mosun = random.uniform(FACTORY_NEW_S, FIELD_TESTED_E) / 2 + random.uniform(FACTORY_NEW_S, FIELD_TESTED_E) / 2
# 崭新 -> 破损
if temp_skin in ['UMP-45 | 迷之宫', 'P250 | 超新星', '系绳匕首 | 深红之网', 'M249 | 翠绿箭毒蛙', 'AK-47 | 血腥运动']:
mosun = random.uniform(FACTORY_NEW_S, WELL_WORN_E) / 2 + random.uniform(FACTORY_NEW_S, WELL_WORN_E) / 2
# 破损 -> 战痕
if temp_skin in [] or temp_skin.find('外表生锈') != -1:
mosun = random.uniform(WELL_WORN_S, BATTLE_SCARED_E) / 2 + random.uniform(WELL_WORN_S, BATTLE_SCARED_E) / 2
if mosun > MINIMAL_WEAR_E:
for _ in range(2):
if random.random() < 5:
if random.random() < 0.2:
mosun /= 3
else:
mosun /= 2
break
skin += " (" + get_wear(mosun) + ")"
return skin, mosun
def random_color_and_st(rand: float) -> Tuple[str, bool]:
"""获取皮肤品质及是否暗金
# M249(StatTrak™) | 等高线
Args:
rand (float): 随机rand
Returns:
Tuple[str, bool]: 品质,是否暗金
"""
if rand <= KNIFE:
if random.random() <= KNIFE_ST:
return ("KNIFE", True)
return ("KNIFE", False)
elif KNIFE < rand <= RED:
if random.random() <= RED_ST:
return ("RED", True)
return ("RED", False)
elif RED < rand <= PINK:
if random.random() <= PINK_ST:
return ("PINK", True)
return ("PINK", False)
elif PINK < rand <= PURPLE:
if random.random() <= PURPLE_ST:
return ("PURPLE", True)
return ("PURPLE", False)
else:
if random.random() <= BLUE_ST:
return ("BLUE", True)
return ("BLUE", False)
async def random_skin(num: int, case_name: str) -> List[Tuple[BuffSkin, float]]:
"""
随机抽取皮肤
"""
color_map = {}
for _ in range(num):
rand = random.random()
# 尝试降低磨损
if rand > MINIMAL_WEAR_E:
for _ in range(2):
if random.random() < 0.5:
logger.debug(f"[START]开箱随机磨损触发降低磨损条件: {rand}")
if random.random() < 0.2:
rand /= 3
else:
rand /= 2
logger.debug(f"[END]开箱随机磨损触发降低磨损条件: {rand}")
break
abrasion = get_wear(rand)
logger.debug(f"开箱随机磨损: {rand} | {abrasion}")
color, is_stattrak = random_color_and_st(rand)
if not color_map.get(color):
color_map[color] = {}
if is_stattrak:
if not color_map[color].get(f"{abrasion}_st"):
color_map[color][f"{abrasion}_st"] = []
color_map[color][f"{abrasion}_st"].append(rand)
else:
if not color_map[color].get(abrasion):
color_map[color][f"{abrasion}"] = []
color_map[color][f"{abrasion}"].append(rand)
skin_list = []
for color in color_map:
for abrasion in color_map[color]:
rand_list = color_map[color][abrasion]
is_stattrak = "_st" in abrasion
abrasion = abrasion.replace("_st", "")
skin_list_ = await BuffSkin.random_skin(
len(rand_list), color, abrasion, is_stattrak, case_name
)
skin_list += [(skin, rand) for skin, rand in zip(skin_list_, rand_list)]
return skin_list
# M249(StatTrak™) | 等高线
-2
View File
@@ -1,2 +0,0 @@
from .open_cases_user import *
from .buff_prices import *
+50
View File
@@ -0,0 +1,50 @@
import random
from typing import List, Optional
from tortoise import fields
from tortoise.contrib.postgres.functions import Random
from services.db_context import Model
class BuffSkin(Model):
id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id"""
case_name = fields.CharField(255)
"""箱子名称"""
name = fields.CharField(255)
"""武器/手套/刀名称"""
skin_name = fields.CharField(255)
"""皮肤名称"""
is_stattrak = fields.BooleanField(default=False)
"""是否暗金(计数)"""
abrasion = fields.CharField(255)
"""磨损度"""
color = fields.CharField(255)
"""颜色(品质)"""
skin_price = fields.FloatField(default=0)
"""皮肤价格"""
create_time = fields.DatetimeField(auto_add_now=True)
"""创建日期"""
update_time = fields.DatetimeField(auto_add=True)
"""更新日期"""
class Meta:
table = "buff_skin"
table_description = "Buff皮肤数据表"
@classmethod
async def random_skin(
cls,
num: int,
color: str,
abrasion: str,
is_stattrak: bool = False,
case_name: Optional[str] = None,
) -> List["BuffSkin"]:
query = cls
if case_name:
query = query.filter(case_name=case_name)
query = query.filter(abrasion=abrasion, is_stattrak=is_stattrak, color=color)
return await query.annotate(rand=Random()).limit(num) # type:ignore
+22 -16
View File
@@ -4,7 +4,6 @@ from services.db_context import Model
class OpenCasesUser(Model):
__tablename__ = "open_cases_users"
id = fields.IntField(pk=True, generated=True, auto_increment=True)
"""自增id"""
@@ -12,40 +11,47 @@ class OpenCasesUser(Model):
"""用户id"""
group_id = fields.BigIntField()
"""群聊id"""
total_count = fields.IntField(default=0)
total_count: int = fields.IntField(default=0)
"""总开启次数"""
blue_count = fields.IntField(default=0)
blue_count: int = fields.IntField(default=0)
"""蓝色"""
blue_st_count = fields.IntField(default=0)
blue_st_count: int = fields.IntField(default=0)
"""蓝色暗金"""
purple_count = fields.IntField(default=0)
purple_count: int = fields.IntField(default=0)
"""紫色"""
purple_st_count = fields.IntField(default=0)
purple_st_count: int = fields.IntField(default=0)
"""紫色暗金"""
pink_count = fields.IntField(default=0)
pink_count: int = fields.IntField(default=0)
"""粉色"""
pink_st_count = fields.IntField(default=0)
pink_st_count: int = fields.IntField(default=0)
"""粉色暗金"""
red_count = fields.IntField(default=0)
red_count: int = fields.IntField(default=0)
"""紫色"""
red_st_count = fields.IntField(default=0)
red_st_count: int = fields.IntField(default=0)
"""紫色暗金"""
knife_count = fields.IntField(default=0)
knife_count: int = fields.IntField(default=0)
"""金色"""
knife_st_count = fields.IntField(default=0)
knife_st_count: int = fields.IntField(default=0)
"""金色暗金"""
spend_money = fields.IntField(default=0)
spend_money: int = fields.IntField(default=0)
"""花费金币"""
make_money = fields.IntField(default=0)
make_money: float = fields.FloatField(default=0)
"""赚取金币"""
today_open_total = fields.IntField(default=0)
today_open_total: int = fields.IntField(default=0)
"""今日开箱数量"""
open_cases_time_last = fields.DatetimeField()
"""最后开箱日期"""
knifes_name = fields.TextField(default="")
knifes_name: str = fields.TextField(default="")
"""已获取金色"""
class Meta:
table = "open_cases_users"
table_description = "开箱统计数据表"
unique_together = ("user_qq", "group_id")
@classmethod
async def _run_script(cls):
await cls.raw(
"alter table open_cases_users alter COLUMN make_money type float;"
)
"""将make_money字段改为float"""
+178 -269
View File
@@ -1,8 +1,10 @@
import asyncio
import random
from datetime import datetime, timedelta
from datetime import datetime
from typing import Union
import pypinyin
from nonebot.adapters.onebot.v11 import Message
from PIL import Image
from configs.config import Config
@@ -16,164 +18,147 @@ from utils.utils import cn2py
from .config import *
from .models.buff_prices import BuffPrice
from .models.open_cases_user import OpenCasesUser
from .utils import get_price
RESULT_MESSAGE = {
"BLUE": ["这样看着才舒服", "是自己人,大伙把刀收好", "非常舒适~"],
"PURPLE": ["还行吧,勉强接受一下下", "居然不是蓝色,太假了", "运气-1-1-1-1-1..."],
"PINK": ["开始不适....", "你妈妈买菜必涨价!涨三倍!", "你最近不适合出门,真的"],
"RED": ["已经非常不适", "好兄弟你开的什么箱子啊,一般箱子不是只有蓝色的吗", "开始拿阳寿开箱子了?"],
"KNIFE": ["你的好运我收到了,你可以去喂鲨鱼了", "最近该吃啥就迟点啥吧,哎,好好的一个人怎么就....哎", "众所周知,欧皇寿命极短."],
}
COLOR2NAME = {"BLUE": "军规", "PURPLE": "受限", "PINK": "保密", "RED": "隐秘", "KNIFE": "罕见"}
COLOR2CN = {"BLUE": "蓝", "PURPLE": "紫", "PINK": "粉", "RED": "红", "KNIFE": "金"}
async def open_case(user_qq: int, group: int, case_name: str = "狂牙大行动") -> str:
def add_count(user: OpenCasesUser, skin: BuffSkin):
if skin.color == "BLUE":
if skin.is_stattrak:
user.blue_st_count += 1
else:
user.blue_count += 1
elif skin.color == "PURPLE":
if skin.is_stattrak:
user.purple_st_count += 1
else:
user.purple_count += 1
elif skin.color == "PINK":
if skin.is_stattrak:
user.pink_st_count += 1
else:
user.pink_count += 1
elif skin.color == "RED":
if skin.is_stattrak:
user.red_st_count += 1
else:
user.red_count += 1
elif skin.color == "KNIFE":
if skin.is_stattrak:
user.knife_st_count += 1
else:
user.knife_count += 1
user.today_open_total += 1
user.total_count += 1
user.make_money += skin.skin_price
user.spend_money += 17
async def get_user_max_count(user_qq: int, group_id: int) -> int:
"""获取用户每日最大开箱次数
Args:
user_qq (int): 用户id
group_id (int): 群号
Returns:
int: 最大开箱次数
"""
user, _ = await SignGroupUser.get_or_create(user_qq=user_qq, group_id=group_id)
impression = int(user.impression)
initial_open_case_count = Config.get_config("open_cases", "INITIAL_OPEN_CASE_COUNT")
each_impression_add_count = Config.get_config(
"open_cases", "EACH_IMPRESSION_ADD_COUNT"
)
return int(initial_open_case_count + impression / each_impression_add_count) # type: ignore
async def open_case(
user_qq: int, group_id: int, case_name: str = "狂牙大行动"
) -> Union[str, Message]:
"""开箱
Args:
user_qq (int): 用户id
group_id (int): 群号
case_name (str, optional): 武器箱名称. Defaults to "狂牙大行动".
Returns:
Union[str, Message]: 回复消息
"""
if case_name not in ["狂牙大行动", "突围大行动", "命悬一线", "裂空", "光谱"]:
return "武器箱未收录"
knifes_flag = False
# lan zi fen hong jin price
uplist = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0]
case = ""
for i in pypinyin.pinyin(case_name, style=pypinyin.NORMAL):
case += "".join(i)
user, _ = await SignGroupUser.get_or_create(user_qq=user_qq, group_id=group)
impression = user.impression
rand = random.random()
await OpenCasesUser.get_or_none(user_qq=user_qq, group_id=group)
# user, _ = await OpenCasesUser.get_or_create(user_qq=user_qq, group_id=group)
user = await OpenCasesUser.get_or_none(user_qq=user_qq, group_id=group)
logger.debug(f"尝试开启武器箱: {case_name}", "开箱", user_qq, group_id)
case = cn2py(case_name)
user = await OpenCasesUser.get_or_none(user_qq=user_qq, group_id=group_id)
if not user:
user = await OpenCasesUser.create(
user_qq=user_qq, group_id=group, open_cases_time_last=datetime.now()
user_qq=user_qq, group_id=group_id, open_cases_time_last=datetime.now()
)
max_count = await get_user_max_count(user_qq, group_id)
# 一天次数上限
if user.today_open_total >= int(
Config.get_config("open_cases", "INITIAL_OPEN_CASE_COUNT")
+ int(impression) / Config.get_config("open_cases", "EACH_IMPRESSION_ADD_COUNT")
):
if user.today_open_total >= max_count:
return _handle_is_MAX_COUNT()
skin, mosun = get_color_quality(rand, case_name)
# 调侃
if skin[:2] == "军规":
if skin.find("StatTrak") == -1:
uplist[0] = 1
else:
uplist[1] = 1
ridicule_result = random.choice(["这样看着才舒服", "是自己人,大伙把刀收好", "非常舒适~"])
if skin[:2] == "受限":
if skin.find("StatTrak") == -1:
uplist[2] = 1
else:
uplist[3] = 1
ridicule_result = random.choice(
["还行吧,勉强接受一下下", "居然不是蓝色,太假了", "运气-1-1-1-1-1..."]
skin_list = await random_skin(1, case_name)
if not skin_list:
return "未抽取到任何皮肤..."
skin, rand = skin_list[0]
rand = str(rand)[:11]
add_count(user, skin)
ridicule_result = random.choice(RESULT_MESSAGE[skin.color])
price_result = skin.skin_price
if skin.color == "KNIFE":
user.knifes_name = (
user.knifes_name
+ f"{case}||{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损:{rand}, 价格:{skin.skin_price},"
)
if skin[:2] == "保密":
if skin.find("StatTrak") == -1:
uplist[4] = 1
else:
uplist[5] = 1
ridicule_result = random.choice(["开始不适....", "你妈妈买菜必涨价!涨三倍!", "你最近不适合出门,真的"])
if skin[:2] == "隐秘":
if skin.find("StatTrak") == -1:
uplist[6] = 1
else:
uplist[7] = 1
ridicule_result = random.choice(
["已经非常不适", "好兄弟你开的什么箱子啊,一般箱子不是只有蓝色的吗", "开始拿阳寿开箱子了?"]
)
if skin[:2] == "罕见":
knifes_flag = True
if skin.find("StatTrak") == -1:
uplist[8] = 1
else:
uplist[9] = 1
ridicule_result = random.choice(
["你的好运我收到了,你可以去喂鲨鱼了", "最近该吃啥就迟点啥吧,哎,好好的一个人怎么就....哎", "众所周知,欧皇寿命极短."]
)
if skin.find("(") != -1:
cskin = skin.split("(")
skin = cskin[0].strip() + "(" + cskin[1].strip()
skin = skin.split("|")[0].strip() + " | " + skin.split("|")[1].strip()
# 价格
if skin.find("无涂装") == -1:
search_name = skin[9:]
else:
search_name = skin[9 : skin.rfind("(")].strip()
price_result = 0
if data := await BuffPrice.get_or_none(skin_name=search_name):
if data.skin_price != 0:
price_result = data.skin_price
logger.info("数据库查询到价格: ", data.skin_price)
uplist[10] = data.skin_price
else:
price = -1
price_result = "未查询到"
price_list, status = await get_price(skin[9:])
if price_list not in ["访问超时! 请重试或稍后再试!", "访问失败!"]:
for price_l in price_list[1:]:
pcp = price_l.split(":")
if pcp[0] == skin[9:]:
price = float(pcp[1].strip())
break
if price != -1:
logger.info("存储入数据库---->{price}")
uplist[10] = price
price_result = str(price)
data.skin_price = price
data.update_date = datetime.now()
await data.save(update_fields=["skin_price", "update_date"])
# sp = skin.split("|")
# cskin_word = sp[1][:sp[1].find("(") - 1].strip()
if knifes_flag:
await user.update(
knifes_name=user.knifes_name
+ f"{case}||{skin.split(':')[1].strip()} 磨损:{str(mosun)[:11]}, 价格:{uplist[10]},"
).apply()
cskin_word = skin.split(":")[1].replace("|", "-").replace("(StatTrak™)", "")
cskin_word = cskin_word[: cskin_word.rfind("(")].strip()
skin_name = cn2py(cskin_word.replace("|", "-").replace("(StatTrak™)", "").strip())
img = image(IMAGE_PATH / "cases" / case / f"{skin_name}.png")
# if knifes_flag:
# await user.update(
# knifes_name=user.knifes_name + f"{skin} 磨损:{mosun}, 价格:{uplist[10]}"
# ).apply()
if await update_user_total(user, uplist):
logger.info(
f"qq:{user_qq} 群:{group} 开启{case_name}武器箱 获得 {skin} 磨损:{mosun}, 价格:{uplist[10]}, 数据更新成功"
)
else:
logger.warning(
f"qq:{user_qq} 群:{group} 开启{case_name}武器箱 获得 {skin} 磨损:{mosun}, 价格:{uplist[10]}, 数据更新失败"
)
user, _ = await OpenCasesUser.get_or_create(user_qq=user_qq, group_id=group)
over_count = (
int(
Config.get_config("open_cases", "INITIAL_OPEN_CASE_COUNT")
+ int(impression)
/ Config.get_config("open_cases", "EACH_IMPRESSION_ADD_COUNT")
)
- user.today_open_total
img_path = (
IMAGE_PATH
/ "cases"
/ case
/ f"{cn2py(skin.name)} - {cn2py(skin.skin_name)}.png"
)
logger.info(
f"开启{case_name}武器箱获得 {skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损: [{rand}] 价格: {skin.skin_price}",
"开箱",
user_qq,
group_id,
)
await user.save()
over_count = max_count - user.today_open_total
return (
f"开启{case_name}武器箱.\n剩余开箱次数:{over_count}.\n" + img + "\n" + f"皮肤:{skin}\n"
f"磨损:{mosun:.9f}\n"
f"开启{case_name}武器箱.\n剩余开箱次数:{over_count}.\n"
+ image(img_path)
+ "\n"
+ f"皮肤:[{COLOR2NAME[skin.color]}]{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion})\n"
f"磨损:{rand}\n"
f"价格:{price_result}\n"
f"{ridicule_result}"
f":{ridicule_result}"
)
async def open_shilian_case(user_qq: int, group: int, case_name: str, num: int = 10):
user, _ = await OpenCasesUser.get_or_create(user_qq=user_qq, group_id=group)
sign_user, _ = await SignGroupUser.get_or_create(user_qq=user_qq, group_id=group)
impression = sign_user.impression
max_count = int(
Config.get_config("open_cases", "INITIAL_OPEN_CASE_COUNT")
+ int(impression) / Config.get_config("open_cases", "EACH_IMPRESSION_ADD_COUNT")
)
async def open_multiple_case(
user_qq: int, group_id: int, case_name: str, num: int = 10
):
user, _ = await OpenCasesUser.get_or_create(user_qq=user_qq, group_id=group_id)
max_count = await get_user_max_count(user_qq, group_id)
if user.today_open_total >= max_count:
return _handle_is_MAX_COUNT()
if max_count - user.today_open_total < num:
return (
f"今天开箱次数不足{num}次噢,请单抽试试看(也许单抽运气更好?)"
f"\n剩余开箱次数:{max_count - user.today_open_total}"
f"\n剩余开箱次数:{max_count - user.today_open_total}"
)
user.total_count = user.total_count + num
user.spend_money = user.spend_money + 17 * num
user.today_open_total = user.today_open_total + num
await user.save(update_fields=["total_count", "spend_money", "today_open_total"])
if num < 5:
h = 270
elif num % 5 == 0:
@@ -181,149 +166,73 @@ async def open_shilian_case(user_qq: int, group: int, case_name: str, num: int =
else:
h = 270 * int(num / 5) + 270
case = cn2py(case_name)
# lan zi fen hong jin
# skin_list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# lan zi fen hong jin price
uplist = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.0]
skin_count = {}
img_list = []
name_list = ["蓝", "蓝(暗金)", "紫", "紫(暗金)", "粉", "粉(暗金)", "红", "红(暗金)", "金", "金(暗金)"]
for _ in range(num):
knifes_flag = False
rand = random.random()
skin, mosun = get_color_quality(rand, case_name)
if skin[:2] == "军规":
if skin.find("StatTrak") == -1:
uplist[0] += 1
else:
uplist[1] += 1
if skin[:2] == "受限":
if skin.find("StatTrak") == -1:
uplist[2] += 1
else:
uplist[3] += 1
if skin[:2] == "保密":
if skin.find("StatTrak") == -1:
uplist[4] += 1
else:
uplist[5] += 1
if skin[:2] == "隐秘":
if skin.find("StatTrak") == -1:
uplist[6] += 1
else:
uplist[7] += 1
if skin[:2] == "罕见":
knifes_flag = True
if skin.find("StatTrak") == -1:
uplist[8] += 1
else:
uplist[9] += 1
if skin.find("(") != -1:
cskin = skin.split("(")
skin = cskin[0].strip() + "(" + cskin[1].strip()
skin = skin.split("|")[0].strip() + " | " + skin.split("|")[1].strip()
# 价格
if skin.find("无涂装") == -1:
search_name = skin[9:]
else:
search_name = skin[9 : skin.rfind("(")].strip()
if dbprice := await BuffPrice.get_or_none(skin_name=search_name):
if dbprice.skin_price != 0:
price_result = dbprice.skin_price
uplist[10] += price_result
else:
price_result = "未查询到"
if knifes_flag:
await user.update(
knifes_name=user.knifes_name
+ f"{case}||{skin.split(':')[1].strip()} 磨损:{str(mosun)[:11]}, 价格:{dbprice.skin_price},"
).apply()
cskin_word = skin.split(":")[1].replace("|", "-").replace("(StatTrak™)", "")
cskin_word = cskin_word[: cskin_word.rfind("(")].strip()
skin_name = ""
for i in pypinyin.pinyin(
cskin_word.replace("|", "-").replace("(StatTrak™)", "").strip(),
style=pypinyin.NORMAL,
):
skin_name += "".join(i)
wImg = BuildImage(200, 270, 200, 200)
wImg.paste(
alpha2white_pil(
Image.open(IMAGE_PATH / "cases" / case / f"{skin_name}.png").resize(
(200, 200), Image.ANTIALIAS
)
),
(0, 0),
skin_list = await random_skin(num, case_name)
if not skin_list:
return "未抽取到任何皮肤..."
total_price = 0
for skin, rand in skin_list:
total_price += skin.skin_price
rand = str(rand)[:11]
add_count(user, skin)
color_name = COLOR2CN[skin.color]
if skin.is_stattrak:
color_name += "(暗金)"
if not skin_count.get(color_name):
skin_count[color_name] = 0
skin_count[color_name] += 1
if skin.color == "KNIFE":
user.knifes_name = (
user.knifes_name
+ f"{case}||{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损:{rand}, 价格:{skin.skin_price},"
)
wImg.text((5, 200), skin)
wImg.text((5, 220), f"磨损:{str(mosun)[:9]}")
wImg.text((5, 240), f"价格:{price_result}")
img_list.append(wImg)
logger.info(
f"USER {user_qq} GROUP {group} 开启{case_name}武器箱 获得 {skin} 磨损:{mosun}, 价格:{uplist[10]}"
)
if await update_user_total(user, uplist, 0):
logger.info(
f"USER {user_qq} GROUP {group} 开启{case_name}武器箱 {num} 次, 数据更新成功"
)
else:
logger.warning(
f"USER {user_qq} GROUP {group} 开启{case_name}武器箱 {num} 次, 价格:{uplist[10]}, 数据更新失败"
)
# markImg = BuildImage(1000, h, 200, 270)
# for img in img_list:
# markImg.paste(img)
markImg = await asyncio.get_event_loop().run_in_executor(
None, paste_markImg, h, img_list
)
over_count = max_count - user.today_open_total
result = ""
for i in range(len(name_list)):
if uplist[i]:
result += f"[{name_list[i]}:{uplist[i]}] "
return (
f"开启{case_name}武器箱\n剩余开箱次数:{over_count}\n"
+ image(b64=markImg.pic2bs4())
+ "\n"
+ result[:-1]
+ f"\n总获取金额:{uplist[-1]:.2f}\n总花费:{17 * num}"
)
def paste_markImg(h: int, img_list: list):
wImg = BuildImage(200, 270, 200, 200)
await wImg.apaste(
alpha2white_pil(
Image.open(
IMAGE_PATH
/ "cases"
/ case
/ f"{cn2py(skin.name)} - {cn2py(skin.skin_name)}.png"
).resize((200, 200), Image.ANTIALIAS)
),
(0, 0),
)
await wImg.atext(
(5, 200),
f"{skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion})",
)
await wImg.atext((5, 220), f"磨损:{rand}")
await wImg.atext((5, 240), f"价格:{skin.skin_price}")
img_list.append(wImg)
logger.info(
f"开启{case_name}武器箱获得 {skin.name}{'(StatTrak™)' if skin.is_stattrak else ''} | {skin.skin_name} ({skin.abrasion}) 磨损: [{rand}] 价格: {skin.skin_price}",
"开箱",
user_qq,
group_id,
)
await user.save()
markImg = BuildImage(1000, h, 200, 270)
for img in img_list:
markImg.paste(img)
return markImg
over_count = max_count - user.today_open_total
result = ""
for color_name in skin_count:
result += f"[{color_name}:{skin_count[color_name]}] "
return (
f"开启{case_name}武器箱\n剩余开箱次数:{over_count}\n"
+ image(markImg.pic2bs4())
+ "\n"
+ result[:-1]
+ f"\n总获取金额:{total_price:.2f}\n总花费:{17 * num}"
)
def _handle_is_MAX_COUNT() -> str:
return f"今天已达开箱上限了喔,明天再来吧\n(提升好感度可以增加每日开箱数 #疯狂暗示)"
async def update_user_total(user: OpenCasesUser, up_list: list, num: int = 1) -> bool:
try:
await user.update_or_create(
total_count=user.total_count + num,
blue_count=user.blue_count + up_list[0],
blue_st_count=user.blue_st_count + up_list[1],
purple_count=user.purple_count + up_list[2],
purple_st_count=user.purple_st_count + up_list[3],
pink_count=user.pink_count + up_list[4],
pink_st_count=user.pink_st_count + up_list[5],
red_count=user.red_count + up_list[6],
red_st_count=user.red_st_count + up_list[7],
knife_count=user.knife_count + up_list[8],
knife_st_count=user.knife_st_count + up_list[9],
spend_money=user.spend_money + 17 * num,
make_money=user.make_money + up_list[10],
today_open_total=user.today_open_total + num,
open_cases_time_last=datetime.now(),
)
return True
except:
return False
async def total_open_statistics(user_qq: int, group: int) -> str:
user, _ = await OpenCasesUser.get_or_create(user_qq=user_qq, group_id=group)
return (
+84 -18
View File
@@ -1,23 +1,25 @@
import os
from asyncio.exceptions import TimeoutError
from datetime import datetime, timedelta
from datetime import datetime
from typing import Optional
from nonebot.adapters.onebot.v11 import ActionFailed
import nonebot
from configs.config import Config
from configs.path_config import IMAGE_PATH
from services.log import logger
from utils.http_utils import AsyncHttpx
from utils.manager import group_manager
from utils.utils import cn2py, get_bot
from utils.utils import broadcast_group, cn2py
from .config import *
from .models.buff_prices import BuffPrice
from .models.buff_skin import BuffSkin
from .models.open_cases_user import OpenCasesUser
url = "https://buff.163.com/api/market/goods"
# proxies = 'http://49.75.59.242:3128'
driver = nonebot.get_driver()
async def util_get_buff_price(case_name: str = "狂牙大行动") -> str:
cookie = {"session": Config.get_config("open_cases", "COOKIE")}
@@ -255,22 +257,86 @@ async def get_price(d_name):
return result[:-1], 999
async def update_count_daily():
async def reset_count_daily():
"""
重置每日开箱
"""
try:
await OpenCasesUser.all().update(today_open_total=0)
bot = get_bot()
gl = await bot.get_group_list()
gl = [g["group_id"] for g in gl]
for g in gl:
try:
await bot.send_group_msg(
group_id=g, message="[[_task|open_case_reset_remind]]今日开箱次数重置成功"
)
except ActionFailed:
logger.warning(f"{g} 群被禁言,无法发送 开箱重置提醒")
logger.info("今日开箱次数重置成功")
await broadcast_group(
"[[_task|open_case_reset_remind]]今日开箱次数重置成功", log_cmd="开箱重置提醒"
)
except Exception as e:
logger.error(f"开箱重置错误 e:{e}")
logger.error(f"开箱重置错误", e=e)
def get_color(case_name: str, name: str, skin_name: str) -> Optional[str]:
case_py = cn2py(case_name).upper()
color_map = {}
color_map["KNIFE"] = eval(case_py + "_CASE_KNIFE")
color_map["RED"] = eval(case_py + "_CASE_RED")
color_map["PINK"] = eval(case_py + "_CASE_PINK")
color_map["PURPLE"] = eval(case_py + "_CASE_PURPLE")
color_map["BLUE"] = eval(case_py + "_CASE_BLUE")
for key in color_map:
for skin in color_map[key]:
if name in skin and skin_name in skin:
return key
return None
@driver.on_startup
async def _():
"""
将旧表数据移动到新表
"""
if not await BuffSkin.first() and await BuffPrice.first():
logger.debug("开始移动旧表数据 BuffPrice -> BuffSkin")
id2name = {1: "狂牙大行动", 2: "突围大行动", 3: "命悬一线", 4: "裂空", 5: "光谱"}
data_list: List[BuffSkin] = []
for data in await BuffPrice.all():
logger.debug(f"移动旧表数据: {data.skin_name}")
case_name = id2name[data.case_id]
name = data.skin_name
is_stattrak = "StatTrak" in name
name = name.replace("(★ StatTrak™)", "").replace("(StatTrak™)", "").strip()
name, skin_name = name.split("|")
abrasion = "无涂装"
if "(" in skin_name:
skin_name, abrasion = skin_name.split("(")
if abrasion.endswith(")"):
abrasion = abrasion[:-1]
color = get_color(case_name, name.strip(), skin_name.strip())
if not color:
search_list = [
x
for x in data_list
if x.skin_name == skin_name.strip() and x.name == name.strip()
]
if search_list:
color = get_color(
case_name, search_list[0].name, search_list[0].skin_name
)
if not color:
logger.debug(
f"箱子: [{case_name}] 皮肤: [{name}|{skin_name}] 未获取到皮肤品质,跳过..."
)
continue
data_list.append(
BuffSkin(
case_name=case_name,
name=name.strip(),
skin_name=skin_name.strip(),
is_stattrak=is_stattrak,
abrasion=abrasion.strip(),
skin_price=data.skin_price,
color=color,
create_time=datetime.now(),
update_time=datetime.now(),
)
)
await BuffSkin.bulk_create(data_list, batch_size=10)
logger.debug("完成移动旧表数据 BuffPrice -> BuffSkin")
# 蝴蝶刀(★) | 噩梦之夜 (久经沙场)
+1
View File
@@ -35,6 +35,7 @@ Config.add_plugin_config(
True,
help_="被动 B站转发解析 进群默认开关状态",
default_value=True,
type=bool
)
+12 -6
View File
@@ -1,7 +1,9 @@
from pathlib import Path
from typing import Tuple
import nonebot
from configs.config import Config
from utils.utils import GDict
Config.add_plugin_config(
"hibiapi",
@@ -25,6 +27,7 @@ Config.add_plugin_config(
5000,
help_="最低收藏,PIX使用HIBIAPI搜索图片时达到最低收藏才会添加至图库",
default_value=5000,
type=int,
)
Config.add_plugin_config(
"pix",
@@ -32,6 +35,7 @@ Config.add_plugin_config(
(0, 1),
help_="自动撤回,参1:延迟撤回色图时间(秒),0 为关闭 | 参2:监控聊天类型,0(私聊) 1(群聊) 2(群聊+私聊)",
default_value=(0, 1),
type=Tuple[int, int],
)
Config.add_plugin_config(
"pix",
@@ -39,13 +43,15 @@ Config.add_plugin_config(
(10, 0),
help_="PIX图库 与 额外图库OmegaPixivIllusts 混合搜索的比例 参1:PIX图库 参2:OmegaPixivIllusts扩展图库(没有此图库请设置为0)",
default_value=(10, 0),
type=Tuple[int, int],
)
Config.add_plugin_config(
"pix", "TIMEOUT", 10, help_="下载图片超时限制(秒)", default_value=10, type=int
)
Config.add_plugin_config("pix", "TIMEOUT", 10, help_="下载图片超时限制(秒)", default_value=10)
Config.add_plugin_config(
"pix", "SHOW_INFO", True, help_="是否显示图片的基本信息,如PID等", default_value=True
"pix", "SHOW_INFO", True, help_="是否显示图片的基本信息,如PID等", default_value=True, type=bool
)
GDict["run_sql"].append("ALTER TABLE omega_pixiv_illusts ADD classified Integer;")
nonebot.load_plugins("plugins/pix_gallery")
# GDict["run_sql"].append("ALTER TABLE omega_pixiv_illusts ADD classified Integer;")
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
+26 -13
View File
@@ -1,16 +1,18 @@
from utils.utils import is_number
from configs.config import Config
from ._model.omega_pixiv_illusts import OmegaPixivIllusts
from utils.message_builder import image, custom_forward_msg
from utils.manager import withdraw_message_manager
from services.log import logger
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, Message
from nonebot.params import CommandArg
from ._data_source import get_image
from ._model.pixiv import Pixiv
from nonebot import on_command
import random
from nonebot import on_command
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageEvent
from nonebot.params import CommandArg
from configs.config import Config
from services.log import logger
from utils.manager import withdraw_message_manager
from utils.message_builder import custom_forward_msg, image
from utils.utils import is_number
from ._data_source import get_image
from ._model.omega_pixiv_illusts import OmegaPixivIllusts
from ._model.pixiv import Pixiv
__zx_plugin_name__ = "PIX"
__plugin_usage__ = """
@@ -55,9 +57,20 @@ __plugin_configs__ = {
"value": None,
"help": "单次发送的图片数量达到指定值时转发为合并消息",
"default_value": None,
"type": int,
},
"ALLOW_GROUP_SETU": {
"value": False,
"help": "允许非超级用户使用-s参数",
"default_value": False,
"type": bool,
},
"ALLOW_GROUP_R18": {
"value": False,
"help": "允许非超级用户使用-r参数",
"default_value": False,
"type": bool,
},
"ALLOW_GROUP_SETU": {"value": False, "help": "允许非超级用户使用-s参数", "default_value": False},
"ALLOW_GROUP_R18": {"value": False, "help": "允许非超级用户使用-r参数", "default_value": False},
}
+34 -27
View File
@@ -1,16 +1,25 @@
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, Message, NetworkError
import time
from asyncio.exceptions import TimeoutError
from typing import Type
from nonebot import on_command
from nonebot.adapters.onebot.v11 import (
Bot,
GroupMessageEvent,
Message,
MessageEvent,
NetworkError,
)
from nonebot.matcher import Matcher
from nonebot.params import CommandArg
from nonebot import on_command
from utils.utils import is_number
from .data_source import get_pixiv_urls, download_pixiv_imgs, search_pixiv_urls
from services.log import logger
from asyncio.exceptions import TimeoutError
from utils.message_builder import custom_forward_msg
from configs.config import Config
from typing import Type
from nonebot.rule import to_me
import time
from configs.config import Config
from services.log import logger
from utils.message_builder import custom_forward_msg
from utils.utils import is_number
from .data_source import download_pixiv_imgs, get_pixiv_urls, search_pixiv_urls
__zx_plugin_name__ = "P站排行/搜图"
@@ -61,21 +70,19 @@ __plugin_settings__ = {
}
__plugin_block_limit__ = {"rst": "P站排行榜或搜图正在搜索,请不要重复触发命令..."}
__plugin_configs__ = {
"TIMEOUT": {
"value": 10,
"help": "图片下载超时限制",
"default_value": 10
},
"TIMEOUT": {"value": 10, "help": "图片下载超时限制", "default_value": 10, "type": int},
"MAX_PAGE_LIMIT": {
"value": 20,
"help": "作品最大页数限制,超过的作品会被略过",
"default_value": 20
"default_value": 20,
"type": int,
},
"ALLOW_GROUP_R18": {
"value": False,
"help": "允许群聊中使用 r18 参数",
"default_value": False
}
"default_value": False,
"type": bool,
},
}
Config.add_plugin_config(
"hibiapi",
@@ -84,12 +91,7 @@ Config.add_plugin_config(
help_="如果没有自建或其他hibiapi请不要修改",
default_value="https://api.obfs.dev",
)
Config.add_plugin_config(
"pixiv",
"PIXIV_NGINX_URL",
"i.pixiv.re",
help_="Pixiv反向代理"
)
Config.add_plugin_config("pixiv", "PIXIV_NGINX_URL", "i.pixiv.re", help_="Pixiv反向代理")
rank_dict = {
@@ -158,7 +160,9 @@ async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
msg = arg.extract_plain_text().strip()
if isinstance(event, GroupMessageEvent):
if "r18" in msg.lower() and not Config.get_config("pixiv_rank_search", "ALLOW_GROUP_R18"):
if "r18" in msg.lower() and not Config.get_config(
"pixiv_rank_search", "ALLOW_GROUP_R18"
):
await pixiv_keyword.finish("(脸红#) 你不会害羞的 八嘎!", at_sender=True)
r18 = 0 if "r18" in msg else 1
msg = msg.replace("r18", "").strip().split()
@@ -168,7 +172,7 @@ async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
num = 10
page = 1
if (n := len(msg)) > 0:
keyword = msg[0].replace("#"," ")
keyword = msg[0].replace("#", " ")
if n > 1:
if not is_number(msg[1]):
await pixiv_keyword.finish("图片数量必须是数字!", at_sender=True)
@@ -206,7 +210,10 @@ async def send_image(
idx = 0
mes_list = []
for title, author, urls in info_list:
_message = f"title: {title}\nauthor: {author}\n" + await download_pixiv_imgs(urls, event.user_id, idx)
_message = (
f"title: {title}\nauthor: {author}\n"
+ await download_pixiv_imgs(urls, event.user_id, idx)
)
mes_list.append(_message)
idx += 1
mes_list = custom_forward_msg(mes_list, bot.self_id)
+1
View File
@@ -57,6 +57,7 @@ __plugin_configs__ = {
"value": 1000,
"help": "俄罗斯轮盘最大赌注金额",
"default_value": 1000,
"type": int,
}
}
+16 -8
View File
@@ -1,12 +1,13 @@
from nonebot import on_command
from .data_source import from_anime_get_info
from services.log import logger
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, Message
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageEvent
from nonebot.params import ArgStr, CommandArg
from nonebot.typing import T_State
from configs.config import Config
from utils.message_builder import custom_forward_msg
from nonebot.params import CommandArg, ArgStr
from configs.config import Config
from services.log import logger
from utils.message_builder import custom_forward_msg
from .data_source import from_anime_get_info
__zx_plugin_name__ = "搜番"
__plugin_usage__ = f"""
@@ -29,7 +30,12 @@ __plugin_settings__ = {
}
__plugin_block_limit__ = {"rst": "搜索还未完成,不要重复触发!"}
__plugin_configs__ = {
"SEARCH_ANIME_MAX_INFO": {"value": 20, "help": "搜索动漫返回的最大数量", "default_value": 20}
"SEARCH_ANIME_MAX_INFO": {
"value": 20,
"help": "搜索动漫返回的最大数量",
"default_value": 20,
"type": int,
}
}
search_anime = on_command("搜番", aliases={"搜动漫"}, priority=5, block=True)
@@ -42,7 +48,9 @@ async def _(state: T_State, arg: Message = CommandArg()):
@search_anime.got("anime", prompt="是不是少了番名?")
async def _(bot: Bot, event: MessageEvent, state: T_State, key_word: str = ArgStr("anime")):
async def _(
bot: Bot, event: MessageEvent, state: T_State, key_word: str = ArgStr("anime")
):
await search_anime.send(f"开始搜番 {key_word}", at_sender=True)
anime_report = await from_anime_get_info(
key_word,
+15 -10
View File
@@ -1,12 +1,13 @@
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, Message, MessageEvent
from nonebot.params import Arg, ArgStr, CommandArg, Depends
from nonebot.plugin import on_command
from nonebot.adapters.onebot.v11 import Bot, MessageEvent, GroupMessageEvent, Message
from nonebot.typing import T_State
from services.log import logger
from utils.utils import get_message_img
from utils.message_builder import custom_forward_msg
from nonebot.params import CommandArg, Arg, ArgStr, Depends
from .saucenao import get_saucenao_image
from services.log import logger
from utils.message_builder import custom_forward_msg
from utils.utils import get_message_img
from .saucenao import get_saucenao_image
__zx_plugin_name__ = "识图"
__plugin_usage__ = """
@@ -27,7 +28,12 @@ __plugin_settings__ = {
"cmd": ["识图"],
}
__plugin_configs__ = {
"MAX_FIND_IMAGE_COUNT": {"value": 3, "help": "识图返回的最大结果数", "default_value": 3},
"MAX_FIND_IMAGE_COUNT": {
"value": 3,
"help": "识图返回的最大结果数",
"default_value": 3,
"type": int,
},
"API_KEY": {
"value": None,
"help": "Saucenao的API_KEY,通过 https://saucenao.com/user.php?page=search-api 注册获取",
@@ -44,12 +50,11 @@ async def get_image_info(mod: str, url: str):
def parse_image(key: str):
async def _key_parser(
state: T_State, img: Message = Arg(key)
):
async def _key_parser(state: T_State, img: Message = Arg(key)):
if not get_message_img(img):
await search_image.reject_arg(key, "请发送要识别的图片!")
state[key] = img
return _key_parser
+9 -4
View File
@@ -1,13 +1,17 @@
from datetime import datetime
from configs.config import Config
from nonebot import on
from nonebot.adapters.onebot.v11 import (Bot, Event, GroupMessageEvent,
PrivateMessageEvent)
from nonebot.adapters.onebot.v11 import (
Bot,
Event,
GroupMessageEvent,
PrivateMessageEvent,
)
from nonebot.message import handle_event
from ._rule import rule
from configs.config import Config
from ._rule import rule
__zx_plugin_name__ = "自身消息触发 [Hidden]"
__plugin_version__ = 0.1
@@ -18,6 +22,7 @@ Config.add_plugin_config(
False,
help_="允许真寻自身触发命令,需要在go-cqhttp配置文件中report-self-message修改为true,触发命令时需前缀cmd且受权限影响,例如:cmd签到",
default_value=False,
type=bool,
)
message_sent = on(
+18 -3
View File
@@ -78,29 +78,44 @@ __plugin_configs__ = {
"value": (0, 1),
"help": "自动撤回,参1:延迟撤回色图时间(秒),0 为关闭 | 参2:监控聊天类型,0(私聊) 1(群聊) 2(群聊+私聊)",
"default_value": (0, 1),
"type": Tuple[int, int],
},
"ONLY_USE_LOCAL_SETU": {
"value": False,
"help": "仅仅使用本地色图,不在线搜索",
"default_value": False,
"type": bool,
},
"INITIAL_SETU_PROBABILITY": {
"value": 0.7,
"help": "初始色图概率,总概率 = 初始色图概率 + 好感度",
"default_value": 0.7,
"type": float,
},
"DOWNLOAD_SETU": {
"value": True,
"help": "是否存储下载的色图,使用本地色图可以加快图片发送速度",
"default_value": True,
"type": bool,
},
"TIMEOUT": {"value": 10, "help": "色图下载超时限制(秒)", "default_value": 10, "type": int},
"SHOW_INFO": {
"value": True,
"help": "是否显示色图的基本信息,如PID等",
"default_value": True,
"type": bool,
},
"ALLOW_GROUP_R18": {
"value": False,
"help": "在群聊中启用R18权限",
"default_value": False,
"type": bool,
},
"TIMEOUT": {"value": 10, "help": "色图下载超时限制(秒)", "default_value": 10},
"SHOW_INFO": {"value": True, "help": "是否显示色图的基本信息,如PID等", "default_value": True},
"ALLOW_GROUP_R18": {"value": False, "help": "在群聊中启用R18权限", "default_value": False},
"MAX_ONCE_NUM2FORWARD": {
"value": None,
"help": "单次发送的图片数量达到指定值时转发为合并消息",
"default_value": None,
"type": int,
},
}
Config.add_plugin_config("pixiv", "PIXIV_NGINX_URL", "i.pixiv.re", help_="Pixiv反向代理")
+30 -17
View File
@@ -1,24 +1,25 @@
from typing import Tuple, Any
from pathlib import Path
from typing import Any, Tuple
from .group_user_checkin import (
group_user_check_in,
group_user_check,
group_impression_rank,
impression_rank,
check_in_all
)
from nonebot import on_command, on_regex
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message
from nonebot.adapters.onebot.v11.permission import GROUP
from utils.message_builder import image
from nonebot import on_command, on_regex
from utils.utils import scheduler
from nonebot.params import CommandArg, RegexGroup
from pathlib import Path
from configs.path_config import DATA_PATH
from services.log import logger
from .utils import clear_sign_data_pic
from utils.utils import is_number
from utils.message_builder import image
from utils.utils import is_number, scheduler
from .goods_register import driver
from .group_user_checkin import (
check_in_all,
group_impression_rank,
group_user_check,
group_user_check_in,
impression_rank,
)
from .utils import clear_sign_data_pic
try:
import ujson as json
@@ -49,22 +50,34 @@ __plugin_settings__ = {
}
__plugin_cd_limit__ = {}
__plugin_configs__ = {
"MAX_SIGN_GOLD": {"value": 200, "help": "签到好感度加成额外获得的最大金币数", "default_value": 200},
"SIGN_CARD1_PROB": {"value": 0.2, "help": "签到好感度双倍加持卡Ⅰ掉落概率", "default_value": 0.2},
"MAX_SIGN_GOLD": {
"value": 200,
"help": "签到好感度加成额外获得的最大金币数",
"default_value": 200,
"type": int,
},
"SIGN_CARD1_PROB": {
"value": 0.2,
"help": "签到好感度双倍加持卡Ⅰ掉落概率",
"default_value": 0.2,
"type": float,
},
"SIGN_CARD2_PROB": {
"value": 0.09,
"help": "签到好感度双倍加持卡Ⅱ掉落概率",
"default_value": 0.09,
"type": float,
},
"SIGN_CARD3_PROB": {
"value": 0.05,
"help": "签到好感度双倍加持卡Ⅲ掉落概率",
"default_value": 0.05,
"type": float,
},
}
_file = Path(f"{DATA_PATH}/not_show_sign_rank_user.json")
_file = DATA_PATH / "not_show_sign_rank_user.json"
try:
data = json.load(open(_file, "r", encoding="utf8"))
except (FileNotFoundError, ValueError, TypeError):
+13 -9
View File
@@ -1,14 +1,17 @@
from nonebot import on_command
from nonebot.typing import T_State
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent
from .data_source import download_gocq_lasted, upload_gocq_lasted
from services.log import logger
from utils.utils import scheduler, get_bot
from nonebot.permission import SUPERUSER
from configs.config import Config
from pathlib import Path
import os
from pathlib import Path
from typing import List
from nonebot import on_command
from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent
from nonebot.permission import SUPERUSER
from nonebot.typing import T_State
from configs.config import Config
from services.log import logger
from utils.utils import get_bot, scheduler
from .data_source import download_gocq_lasted, upload_gocq_lasted
__zx_plugin_name__ = "更新gocq [Superuser]"
__plugin_usage__ = """
@@ -25,6 +28,7 @@ __plugin_configs__ = {
"value": [],
"help": "需要为哪些群更新最新版gocq吗?(上传最新版gocq)示例:[434995955, 239483248]",
"default_value": [],
"type": List[int],
}
}
+7 -6
View File
@@ -1,12 +1,13 @@
from nonebot.adapters.onebot.v11 import Bot, MessageEvent
from nonebot.matcher import Matcher
from nonebot.message import IgnoredException, run_preprocessor
from nonebot.typing import T_State
from configs.config import Config as gConfig
from utils.manager import plugins2settings_manager
from .api import *
from .auth import *
from nonebot.matcher import Matcher
from nonebot.message import run_preprocessor, IgnoredException
from utils.manager import plugins2settings_manager
from nonebot.typing import T_State
from nonebot.adapters.onebot.v11 import Bot, MessageEvent
gConfig.add_plugin_config("web-ui", "username", "admin", name="web-ui", help_="前端管理用户名")
+8 -4
View File
@@ -1,6 +1,9 @@
from pathlib import Path
import nonebot
from configs.config import Config
from utils.utils import GDict
import nonebot
Config.add_plugin_config(
"word_bank",
@@ -8,9 +11,10 @@ Config.add_plugin_config(
5,
name="词库问答",
help_="设置增删词库的权限等级",
default_value=5
default_value=5,
type=int,
)
GDict['run_sql'].append("ALTER TABLE word_bank2 ADD to_me VARCHAR(255);")
GDict["run_sql"].append("ALTER TABLE word_bank2 ADD to_me VARCHAR(255);")
nonebot.load_plugins("plugins/word_bank")
nonebot.load_plugins(str(Path(__file__).parent.resolve()))
+29 -18
View File
@@ -1,16 +1,19 @@
import re
from datetime import datetime, timedelta
from typing import Tuple, Union
import pytz
from nonebot import on_command, get_driver
from nonebot import get_driver, on_command
from nonebot.adapters.onebot.v11 import Message, MessageSegment
from nonebot.adapters.onebot.v11.event import GroupMessageEvent
from nonebot.matcher import Matcher
from nonebot.params import Arg, Command, CommandArg, Depends
from nonebot.typing import T_State
from .data_source import draw_word_cloud, get_list_msg
from configs.config import Config
from .data_source import draw_word_cloud, get_list_msg
__zx_plugin_name__ = "词云"
__plugin_usage__ = """
@@ -60,13 +63,16 @@ wordcloud_cmd = on_command(
"我的本月词云",
"我的年度词云",
"我的历史词云",
}, block=True, priority=5
},
block=True,
priority=5,
)
Config.add_plugin_config(
"word_clouds",
"WORD_CLOUDS_TEMPLATE",
1,
help_="词云模板 参1:图片生成,默认使用真寻图片,可在项目路径resources/image/wordcloud下配置图片,多张则随机 | 参2/其他:黑底图片"
help_="词云模板 参1:图片生成,默认使用真寻图片,可在项目路径resources/image/wordcloud下配置图片,多张则随机 | 参2/其他:黑底图片",
type=int,
)
@@ -74,9 +80,9 @@ def parse_datetime(key: str):
"""解析数字,并将结果存入 state 中"""
async def _key_parser(
matcher: Matcher,
state: T_State,
input_: Union[datetime, Message] = Arg(key),
matcher: Matcher,
state: T_State,
input_: Union[datetime, Message] = Arg(key),
):
if isinstance(input_, datetime):
return
@@ -102,10 +108,10 @@ def get_datetime_fromisoformat_with_timezone(date_string: str) -> datetime:
@wordcloud_cmd.handle()
async def handle_first_receive(
event: GroupMessageEvent,
state: T_State,
commands: Tuple[str, ...] = Command(),
args: Message = CommandArg(),
event: GroupMessageEvent,
state: T_State,
commands: Tuple[str, ...] = Command(),
args: Message = CommandArg(),
):
command = commands[0]
@@ -172,10 +178,10 @@ async def handle_first_receive(
parameterless=[Depends(parse_datetime("stop"))],
)
async def handle_message(
event: GroupMessageEvent,
start: datetime = Arg(),
stop: datetime = Arg(),
my: bool = Arg(),
event: GroupMessageEvent,
start: datetime = Arg(),
stop: datetime = Arg(),
my: bool = Arg(),
):
# 是否只查询自己的记录
if my:
@@ -183,9 +189,14 @@ async def handle_message(
else:
user_id = None
# 将时间转换到 东八 时区
messages = await get_list_msg(user_id, int(event.group_id),
days=(start.astimezone(pytz.timezone("Asia/Shanghai")),
stop.astimezone(pytz.timezone("Asia/Shanghai"))))
messages = await get_list_msg(
user_id,
int(event.group_id),
days=(
start.astimezone(pytz.timezone("Asia/Shanghai")),
stop.astimezone(pytz.timezone("Asia/Shanghai")),
),
)
if messages:
image_bytes = await draw_word_cloud(messages, get_driver().config)
if image_bytes: