添加库存查询功能

This commit is contained in:
milimoe 2025-11-20 01:41:38 +08:00
parent aac5d35aa2
commit 3f0d5ffa7d
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
3 changed files with 148 additions and 0 deletions

View File

@ -47,6 +47,8 @@
{"物品库存 [页码]", "显示库存中所有物品"},
{"角色库存 [页码]", "显示库存中所有角色"},
{"我的物品 <物品序号>", "查看指定物品详细信息"},
{"库存搜索2/库存查询2 [关键词] [页码]", "查询库存中的物品"},
{"库存搜索/库存查询 [关键词] [页码]", "查询库存中的物品"},
{"抽卡/十连抽卡", "金币抽卡1000/次)"},
{"钻石抽卡/钻石十连抽卡", "钻石抽卡5/次)"},
{"兑换金币 <钻石数>", "1钻石=200金币"},

View File

@ -1,5 +1,6 @@
using System.Text;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
@ -1296,6 +1297,115 @@ namespace Oshima.FunGame.WebAPI.Controllers
return list;
}
[HttpGet("inventoryinfo6")]
public List<string> GetInventoryInfo6([FromQuery] long uid = 0, [FromQuery] int page = 1, [FromQuery] string name = "", [FromForm] bool containsDescription = false)
{
if (page <= 0) page = 1;
PluginConfig pc = FunGameService.GetUserConfig(uid, out _);
FunGameService.ReleaseUserSemaphoreSlim(uid);
List<string> list = [];
if (pc.Count > 0)
{
if (name == "")
{
return ["搜索关键词为空!"];
}
User user = FunGameService.GetUser(pc);
list.Add($"☆★☆ {user.Inventory.Name} ☆★☆");
list.Add($"{General.GameplayEquilibriumConstant.InGameCurrency}{user.Inventory.Credits:0.00}");
list.Add($"{General.GameplayEquilibriumConstant.InGameMaterial}{user.Inventory.Materials:0.00}");
List<Item> items = [.. user.Inventory.Items];
Dictionary<string, List<Item>> itemCategory = [];
foreach (Item item in items)
{
if (!itemCategory.TryAdd(item.GetIdName(), [item]))
{
itemCategory[item.GetIdName()].Add(item);
}
}
// 按品质倒序、数量倒序排序
itemCategory = itemCategory.OrderByDescending(kv => kv.Value.FirstOrDefault()?.QualityType ?? 0).ThenByDescending(kv => kv.Value.Count).ToDictionary();
// 移除所有非指定类型的物品
foreach (List<Item> listTemp in itemCategory.Values)
{
if (listTemp.First() is Item item && (!item.Name.Contains(name) && (!containsDescription || (containsDescription && !item.Description.Contains(name)))))
{
itemCategory.Remove(item.GetIdName());
}
}
int maxPage = (int)Math.Ceiling((double)itemCategory.Count / FunGameConstant.ItemsPerPage1);
if (maxPage < 1) maxPage = 1;
if (page <= maxPage)
{
List<string> keys = [.. FunGameService.GetPage(itemCategory.Keys, page, FunGameConstant.ItemsPerPage1)];
int itemCount = 0;
list.Add($"=== 包含【{name}】的物品 ===");
using SQLHelper? sql = Factory.OpenFactory.GetSQLHelper();
List<Guid> itemTrading = [];
if (sql != null)
{
itemTrading = SQLService.GetUserItemGuids(sql, uid);
}
foreach (string key in keys)
{
itemCount++;
List<Item> objs = itemCategory[key];
Item first = objs[0];
string str = $"{itemCount}. [{ItemSet.GetQualityTypeName(first.QualityType)}|{ItemSet.GetItemTypeName(first.ItemType)}] {first.Name}\r\n";
str += $"物品描述:{first.Description}\r\n";
string itemsIndex = string.Join("", objs.Select(i => items.IndexOf(i) + 1));
if (objs.Count > 10)
{
itemsIndex = string.Join("", objs.Take(10).Select(i => items.IndexOf(i) + 1)) + "...";
}
IEnumerable<Item> itemsEquipable = objs.Where(i => i.IsEquipment && i.Character is null);
string itemsEquipableIndex = string.Join("", itemsEquipable.Select(i => items.IndexOf(i) + 1));
if (itemsEquipable.Count() > 10)
{
itemsEquipableIndex = string.Join("", itemsEquipable.Take(10).Select(i => items.IndexOf(i) + 1)) + "...";
}
IEnumerable<Item> itemsSellable = objs.Where(i => i.IsSellable && !i.IsLock && !itemTrading.Contains(i.Guid));
string itemsSellableIndex = string.Join("", itemsSellable.Select(i => items.IndexOf(i) + 1));
if (itemsSellable.Count() > 10)
{
itemsSellableIndex = string.Join("", itemsSellable.Take(10).Select(i => items.IndexOf(i) + 1)) + "...";
}
IEnumerable<Item> itemsTradable = objs.Where(i => i.IsTradable && !i.IsLock && !itemTrading.Contains(i.Guid));
string itemsTradableIndex = string.Join("", itemsTradable.Select(i => items.IndexOf(i) + 1));
if (itemsTradable.Count() > 10)
{
itemsTradableIndex = string.Join("", itemsTradable.Take(10).Select(i => items.IndexOf(i) + 1)) + "...";
}
str += $"物品序号:{itemsIndex}\r\n";
if (itemsEquipableIndex != "") str += $"可装备序号:{itemsEquipableIndex}\r\n";
if (itemsSellableIndex != "") str += $"可出售序号:{itemsSellableIndex}\r\n";
if (itemsTradableIndex != "") str += $"可交易序号:{itemsTradableIndex}\r\n";
str += $"拥有数量:{objs.Count}" + (first.IsEquipment ? $"可装备数量:{itemsEquipable.Count()}" : "") +
(FunGameConstant.ItemCanUsed.Contains(first.ItemType) ? $"可使用数量:{objs.Count(i => i.RemainUseTimes > 0 && !i.IsLock && !itemTrading.Contains(i.Guid))}" : "") +
$"可出售数量:{itemsSellable.Count()},可交易数量:{itemsTradable.Count()}";
list.Add(str);
}
list.Add($"页数:{page} / {maxPage}");
}
else
{
list.Add($"没有这么多页!当前总页数为 {maxPage},但你请求的是第 {page} 页。");
}
}
else
{
list.Add(noSaved);
}
return list;
}
[HttpPost("newcustomcharacter")]
public string NewCustomCharacter([FromQuery] long? uid = null)
{

View File

@ -1093,6 +1093,42 @@ namespace Oshima.FunGame.WebAPI.Services
return result;
}
if (e.Detail.StartsWith("库存搜索2", StringComparison.CurrentCultureIgnoreCase) || e.Detail.StartsWith("库存查询2", StringComparison.CurrentCultureIgnoreCase))
{
string detail = e.Detail.Replace("库存搜索2", "").Replace("库存查询2", "").Trim();
string[] strings = detail.Split(" ", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
string search = strings[0];
int page = 1;
if (strings.Length > 1 && int.TryParse(strings[1], out int p))
{
page = p;
}
List<string> msgs = Controller.GetInventoryInfo6(uid, page, search, true);
if (msgs.Count > 0)
{
await SendAsync(e, "搜索库存物品(带描述)", "\r\n" + string.Join("\r\n", msgs));
}
return result;
}
if (e.Detail.StartsWith("库存搜索", StringComparison.CurrentCultureIgnoreCase) || e.Detail.StartsWith("库存查询", StringComparison.CurrentCultureIgnoreCase))
{
string detail = e.Detail.Replace("库存搜索", "").Replace("库存查询", "").Trim();
string[] strings = detail.Split(" ", StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries);
string search = strings[0];
int page = 1;
if (strings.Length > 1 && int.TryParse(strings[1], out int p))
{
page = p;
}
List<string> msgs = Controller.GetInventoryInfo6(uid, page, search, false);
if (msgs.Count > 0)
{
await SendAsync(e, "搜索库存物品", "\r\n" + string.Join("\r\n", msgs));
}
return result;
}
if (e.Detail.StartsWith("我角色", StringComparison.CurrentCultureIgnoreCase))
{
string detail = e.Detail.Replace("我角色", "").Trim();