首次提交

This commit is contained in:
Art_Sakura 2025-03-16 19:11:05 +08:00
commit 599acc8a85
25 changed files with 331 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
__pycache__

36
__init__.py Normal file
View File

@ -0,0 +1,36 @@
from nonebot.plugin import PluginMetadata
from nonebot import get_driver
from zhenxun.configs.utils import PluginExtraData
from zhenxun.services.plugin_init import PluginInit
from .gClass import(
g_pSqlManager,
g_pJsonManager
)
from .command import (
diuse_register
)
__plugin_meta = PluginMetadata(
name = "真寻的农场",
description = "快乐的农场时光",
usage = """
农场快乐时光
""".strip(),
extra = PluginExtraData(
author="molanp",
version="1.0",
menu_type="群内小游戏",
).dict(),
)
#注册启动函数
driver = get_driver()
@driver.on_startup
async def start():
#初始化数据库
await g_pSqlManager.init()
await g_pJsonManager.init()

31
command.py Normal file
View File

@ -0,0 +1,31 @@
from nonebot.rule import to_me
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_alconna import Alconna, on_alconna, Text
from zhenxun.services.log import logger
from .gClass import(
g_pSqlManager
)
diuse_register = on_alconna(
Alconna("注册空间"),
priority = 5,
rule=to_me(),
block = True,
)
@diuse_register.handle()
async def _(session: Uninfo):
uid = str(session.user.id)
user = await g_pSqlManager.getUserByUid(uid)
if user:
await diuse_register.send(Text("你已经有啦"), reply_to=True)
else:
info = {'uid' : uid, 'name' : '测试', 'level' : 1, 'point' : 0}
aaa = await g_pSqlManager.appendUserByUserInfo(info)
await diuse_register.send(Text(str(aaa)), reply_to=True)

55
config.py Normal file
View File

@ -0,0 +1,55 @@
import json
from pathlib import Path
from zhenxun.services.log import logger
from zhenxun.configs.path_config import DATA_PATH, IMAGE_PATH, TEMPLATE_PATH
g_sDBPath = DATA_PATH / "farm_db"
g_sDBFilePath = DATA_PATH / "farm_db/farm.db"
class CJsonManager:
def __init__(self):
self.m_pItem = None
self.m_pPlant = None
@classmethod
async def init(cls) -> bool:
if not await cls.initItem():
return False
if not await cls.initPlant():
return False
return True
@classmethod
async def initItem(cls) -> bool:
current_file_path = Path(__file__)
try:
with open(current_file_path.resolve().parent / "config/item.json", 'r', encoding='utf-8') as file:
cls.m_pItem = json.load(file)
return True
except FileNotFoundError:
logger.warning(f"item.json 打开失败: {e}")
return False
except json.JSONDecodeError as e:
logger.warning(f"item.json JSON格式错误: {e}")
return False
@classmethod
async def initPlant(cls) -> bool:
current_file_path = Path(__file__)
try:
with open(current_file_path.resolve().parent / "config/plant.json", 'r', encoding='utf-8') as file:
cls.m_pPlant = json.load(file)
return True
except FileNotFoundError:
logger.warning(f"plant.json 打开失败: {e}")
return False
except json.JSONDecodeError as e:
logger.warning(f"plant.json JSON格式错误: {e}")
return False

21
config/item.json Normal file
View File

@ -0,0 +1,21 @@
{
"item":
{
"zhuShi":
[
"name: 名称",
"level: 等级",
"price: 单价",
"icon: 显示图片",
"sell: 是否可以上架交易行"
],
"muBan":
{
"name": "木板",
"level": 0,
"price": 5000,
"icon": "Test",
"sell": true
}
}
}

65
config/plant.json Normal file
View File

@ -0,0 +1,65 @@
{
"plant":
{
"zhuShi":
[
"name: 名称",
"level: 解锁等级",
"limit: 限制等级 0普通土地 1红土地 2黄土地 3黑土地",
"experience: 收获经验",
"harvest: 收获数量",
"price: 单价",
"time: 成熟时间 单位:分钟",
"crop: 作物可以收几次",
"again: 再次成熟时间 单位:分钟",
"phase: 阶段 目前为 成熟时间 / 阶段 来显示每阶段图片",
"general: 第一阶段是否为通用阶段素材",
"sell: 是否可以上架交易行"
],
"daBaiCai":
{
"name": "大白菜",
"level": 0,
"limit": 0,
"experience": 5,
"harvest": 30,
"price": 5,
"time": 780,
"crop": 1,
"again": 0,
"phase": 5,
"general": true,
"sell": false
},
"baiLuoBo":
{
"name": "白萝卜",
"level": 0,
"limit": 0,
"experience": 5,
"harvest": 30,
"price": 5,
"time": 600,
"crop": 1,
"again": 0,
"phase": 5,
"general": true,
"sell": false
},
"huLuoBo":
{
"name": "胡萝卜",
"level": 0,
"limit": 0,
"experience": 5,
"harvest": 30,
"price": 5,
"time": 5,
"crop": 1,
"again": 0,
"phase": 5,
"general": true,
"sell": false
}
}
}

108
database.py Normal file
View File

@ -0,0 +1,108 @@
import os
import aiosqlite
import asyncio
from zhenxun.services.log import logger
from zhenxun.configs.path_config import DATA_PATH, IMAGE_PATH, TEMPLATE_PATH
from .config import (
g_sDBPath,
g_sDBFilePath
)
class CSqlManager:
def __init__(self):
g_sDBPath.mkdir(parents=True, exist_ok=True)
def __del__(self):
if self.m_pDB:
self.m_pDB.close()
self.m_pDB = None
@classmethod
async def init(cls) -> bool:
bIsExist = os.path.exists(g_sDBFilePath)
cls.m_pDB = await aiosqlite.connect(g_sDBFilePath)
if bIsExist == False:
#TODO 缺少判断创建失败事件
await cls.createDB()
return True
@classmethod
async def createDB(cls) -> bool:
"""初始化数据库表
Returns:
bool: 是否创建成功
"""
try:
await cls.m_pDB.execute('''
CREATE TABLE user (
uid INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
level INTEGER DEFAULT 1,
point INTEGER DEFAULT 0
);
''')
await cls.m_pDB.commit()
return True
except Exception as e:
print(f"An error occurred: {e}")
return False
@classmethod
async def getUserByUid(cls, uid : str) -> list[dict]:
"""根据用户Uid获取用户信息
Args:
uid (str): 用户Uid
Returns:
list[dict]: 用户信息
"""
if len(uid) <= 0:
return []
try:
async with cls.m_pDB.execute("SELECT * FROM user WHERE uid = ?", (uid,)) as cursor:
results = []
async for row in cursor:
user_dict = {
'uid': row[0],
'name': row[1],
'level': row[2],
'point': row[3]
}
results.append(user_dict)
return results
except Exception as e:
logger.warning(f"查询失败: {e}")
return []
@classmethod
async def appendUserByUserInfo(cls, info : list[dict]) -> bool:
"""添加用户信息
Args:
info (list[dict]): 用户信息
Returns:
bool: 是否添加成功
"""
try:
await cls.m_pDB.execute('''
INSERT INTO user (uid, name, level, point) VALUES (?, ?, ?, ?)
''', (info['uid'], info['name'], info['level'], info['point']))
await cls.m_pDB.commit()
return True
except Exception as e:
logger.warning(f"添加失败: {e}")
return False

6
gClass.py Normal file
View File

@ -0,0 +1,6 @@
from .config import CJsonManager
from .database import CSqlManager
g_pJsonManager = CJsonManager()
g_pSqlManager = CSqlManager()

8
initFarm.py Normal file
View File

@ -0,0 +1,8 @@
from nonebot_plugin_uninfo import Uninfo
from nonebot_plugin_alconna import Alconna, At, Image, Match, Text, UniMsg, on_alconna
import command
@diuse_register.handle()
async def _(session: Uninfo):
uid = str(session.user.id)

BIN
resource/basic/0.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
resource/basic/9.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

BIN
resource/大白菜/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
resource/大蒜/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
resource/小麦/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.7 KiB

BIN
resource/水稻/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
resource/油菜/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

BIN
resource/牧草/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
resource/玉米/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
resource/生菜/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
resource/白萝卜/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
resource/胡萝卜/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
resource/胡萝卜/2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
resource/胡萝卜/3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

BIN
resource/胡萝卜/4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

BIN
resource/胡萝卜/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB