提交示例代码

This commit is contained in:
Bob.Song
2026-03-05 11:39:06 +08:00
commit 25958f58c3
2534 changed files with 209593 additions and 0 deletions

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,27 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<OutputPath>../../Bin/</OutputPath>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<OutputPath>../../Bin</OutputPath>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Entity\Entity.csproj" />
<ProjectReference Include="..\Hotfix\Hotfix.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Fantasy-Net.NLog" Version="2024.1.20" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,91 @@
<?xml version="1.0" encoding="utf-8"?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd">
<targets async="true">
<target name="ServerDebug" xsi:type="File"
encoding="UTF-8"
createDirs="true"
autoFlush="false"
keepFileOpen="true"
concurrentWrites="true"
openFileCacheTimeout="30"
openFileFlushTimeout="60"
fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Debug.log"
layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
</targets>
<targets async="true">
<target name="ServerInfo" xsi:type="File"
encoding="UTF-8"
createDirs="true"
autoFlush="false"
keepFileOpen="true"
concurrentWrites="true"
openFileCacheTimeout="30"
openFileFlushTimeout="60"
fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Info.log"
layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
</targets>
<targets async="true">
<target name="ServerWarn" xsi:type="File"
encoding="UTF-8"
createDirs="true"
autoFlush="false"
keepFileOpen="true"
concurrentWrites="true"
openFileCacheTimeout="30"
openFileFlushTimeout="60"
fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Warn.log"
layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
</targets>
<targets async="true">
<target name="ServerError" xsi:type="File"
encoding="UTF-8"
createDirs="true"
autoFlush="false"
keepFileOpen="true"
concurrentWrites="true"
openFileCacheTimeout="30"
openFileFlushTimeout="60"
fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Error.log"
layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
</targets>
<targets async="true">
<target name="ServerTrace" xsi:type="File"
encoding="UTF-8"
createDirs="true"
autoFlush="false"
keepFileOpen="true"
concurrentWrites="true"
openFileCacheTimeout="30"
openFileFlushTimeout="60"
fileName="${basedir}/../Logs/Server/Server${date:format=yyyyMMdd}/${logger}.${var:appId}.${date:format=yyyyMMddHH}.Trace.log"
layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}" />
</targets>
<targets async="true">
<target name="ConsoleColor" xsi:type="ColoredConsole"
useDefaultRowHighlightingRules="false"
layout="${longdate} ${callsite:className=false:methodName=false:fileName=true:includeSourcePath=false:skipFrames=2} ${message}">
<highlight-row condition="level == LogLevel.Debug" foregroundColor="DarkGreen" />
<highlight-row condition="level == LogLevel.Info" foregroundColor="Gray" />
<highlight-row condition="level == LogLevel.Warn" foregroundColor="Yellow" />
<highlight-row condition="level == LogLevel.Error" foregroundColor="DarkRed" />
<highlight-row condition="level == LogLevel.Fatal" foregroundColor="Red" />
</target>
</targets>
<rules>
<!-- 控制台 调试或编辑器启动的时候会调用-->
<logger ruleName="ConsoleTrace" name="Server" level="Trace" writeTo="ConsoleColor" />
<logger ruleName="ConsoleDebug" name="Server" level="Debug" writeTo="ConsoleColor" />
<logger ruleName="ConsoleInfo" name="Server" level="Info" writeTo="ConsoleColor" />
<logger ruleName="ConsoleWarn" name="Server" level="Warn" writeTo="ConsoleColor" />
<logger ruleName="ConsoleError" name="Server" level="Error" writeTo="ConsoleColor" />
<!-- 服务端日志输出文件 发布到服务器后会调用-->
<logger ruleName="ServerDebug" name="Server" level="Debug" writeTo="ServerDebug" />
<logger ruleName="ServerTrace" name="Server" level="Trace" writeTo="ServerTrace" />
<logger ruleName="ServerInfo" name="Server" level="Info" writeTo="ServerInfo" />
<logger ruleName="ServerWarn" name="Server" level="Warn" writeTo="ServerWarn" />
<logger ruleName="ServerError" name="Server" level="Error" writeTo="ServerError" />
</rules>
</nlog>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,23 @@
using Fantasy.Helper;
using Fantasy.IdFactory;
using Fantasy.Platform.Net;
// 获取配置文件
// 比如通过远程获取这个配置文件,这样可以多组服务器共享一套配置了
var machineConfigText = await FileHelper.GetTextByRelativePath("../../Config/Json/Server/MachineConfigData.Json");
var processConfigText = await FileHelper.GetTextByRelativePath("../../Config/Json/Server/ProcessConfigData.Json");
var worldConfigText = await FileHelper.GetTextByRelativePath("../../Config/Json/Server/WorldConfigData.Json");
var sceneConfigText = await FileHelper.GetTextByRelativePath("../../Config/Json/Server/SceneConfigData.Json");
// 初始化配置文件
// 如果重复初始化方法会覆盖掉上一次的数据,非常适合热重载时使用
MachineConfigData.Initialize(machineConfigText);
ProcessConfigData.Initialize(processConfigText);
WorldConfigData.Initialize(worldConfigText);
SceneConfigData.Initialize(sceneConfigText);
// 注册日志模块到框架
// 开发者可以自己注册日志系统到框架只要实现Fantasy.ILog接口就可以。
// 这里用的是NLog日志系统注册到框架中。
Fantasy.Log.Register(new Fantasy.NLog("Server"));
// 初始化框架,添加程序集到框架中
Fantasy.Platform.Net.Entry.Initialize(Fantasy.AssemblyHelper.Assemblies);
// 启动Fantasy.Net
await Fantasy.Platform.Net.Entry.Start();

View File

@@ -0,0 +1,10 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"App": {
"commandName": "Project",
"environmentVariables": {},
"commandLineArgs": "--m Develop"
}
}
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,211 @@
{
"format": 1,
"restore": {
"/Users/fantasy/Movies/邮件系统/Lession/Server/App/App.csproj": {}
},
"projects": {
"/Users/fantasy/Movies/邮件系统/Lession/Server/App/App.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/fantasy/Movies/邮件系统/Lession/Server/App/App.csproj",
"projectName": "App",
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/App/App.csproj",
"packagesPath": "/Users/fantasy/.nuget/packages/",
"outputPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/fantasy/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"/usr/local/share/dotnet/library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {
"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj": {
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj"
},
"/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/Hotfix.csproj": {
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/Hotfix.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "all"
},
"SdkAnalysisLevel": "9.0.100"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Fantasy-Net.NLog": {
"target": "Package",
"version": "[2024.1.20, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.100/PortableRuntimeIdentifierGraph.json"
}
}
},
"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj",
"projectName": "Entity",
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj",
"packagesPath": "/Users/fantasy/.nuget/packages/",
"outputPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/fantasy/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"/usr/local/share/dotnet/library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "all"
},
"SdkAnalysisLevel": "9.0.100"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Fantasy-Net": {
"target": "Package",
"version": "[2024.2.22, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.100/PortableRuntimeIdentifierGraph.json"
}
}
},
"/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/Hotfix.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/Hotfix.csproj",
"projectName": "Hotfix",
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/Hotfix.csproj",
"packagesPath": "/Users/fantasy/.nuget/packages/",
"outputPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/fantasy/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"/usr/local/share/dotnet/library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {
"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj": {
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj"
}
}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "all"
},
"SdkAnalysisLevel": "9.0.100"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.100/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/Users/fantasy/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/Users/fantasy/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.12.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/Users/fantasy/.nuget/packages/" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)fantasy-net/2024.2.22/buildTransitive/Fantasy-Net.targets" Condition="Exists('$(NuGetPackageRoot)fantasy-net/2024.2.22/buildTransitive/Fantasy-Net.targets')" />
<Import Project="$(NuGetPackageRoot)fantasy-net.nlog/2024.1.20/buildTransitive/Fantasy-Net.NLog.targets" Condition="Exists('$(NuGetPackageRoot)fantasy-net.nlog/2024.1.20/buildTransitive/Fantasy-Net.NLog.targets')" />
</ImportGroup>
</Project>

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("App")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("App")]
[assembly: System.Reflection.AssemblyTitleAttribute("App")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// 由 MSBuild WriteCodeFragment 类生成。

View File

@@ -0,0 +1 @@
821daf211998e642fd8571f61784d5b8d6071e65f77b7ed22cfcfb2a43a9388a

View File

@@ -0,0 +1,15 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = App
build_property.ProjectDir = /Users/fantasy/Movies/邮件系统/Lession/Server/App/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1 @@
6ea5d9eb7371ff0fdba6e9dd9f3ce9a46fdad1c2971d1d6a0432963b1d7c5398

View File

@@ -0,0 +1,18 @@
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.csproj.AssemblyReference.cache
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.GeneratedMSBuildEditorConfig.editorconfig
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.AssemblyInfoInputs.cache
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.AssemblyInfo.cs
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.csproj.CoreCompileInputs.cache
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.csproj.Up2Date
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.dll
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/refint/App.dll
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.pdb
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/App.genruntimeconfig.cache
/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/Debug/net8.0/ref/App.dll
/Users/fantasy/Movies/邮件系统/Lession/Bin/net8.0/App
/Users/fantasy/Movies/邮件系统/Lession/Bin/net8.0/NLog.config
/Users/fantasy/Movies/邮件系统/Lession/Bin/net8.0/NLog.xsd
/Users/fantasy/Movies/邮件系统/Lession/Bin/net8.0/App.deps.json
/Users/fantasy/Movies/邮件系统/Lession/Bin/net8.0/App.runtimeconfig.json
/Users/fantasy/Movies/邮件系统/Lession/Bin/net8.0/App.dll
/Users/fantasy/Movies/邮件系统/Lession/Bin/net8.0/App.pdb

View File

@@ -0,0 +1 @@
43c0ad4056946926b0891319e5039496ccf3772662f3c5f77d051184ee024242

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,32 @@
{
"version": 2,
"dgSpecHash": "KiiXK9qXJ3M=",
"success": true,
"projectFilePath": "/Users/fantasy/Movies/邮件系统/Lession/Server/App/App.csproj",
"expectedPackageFiles": [
"/Users/fantasy/.nuget/packages/commandlineparser/2.9.1/commandlineparser.2.9.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/dnsclient/1.6.1/dnsclient.1.6.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/fantasy-net/2024.2.22/fantasy-net.2024.2.22.nupkg.sha512",
"/Users/fantasy/.nuget/packages/fantasy-net.nlog/2024.1.20/fantasy-net.nlog.2024.1.20.nupkg.sha512",
"/Users/fantasy/.nuget/packages/microsoft.extensions.logging.abstractions/2.0.0/microsoft.extensions.logging.abstractions.2.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/microsoft.netcore.platforms/5.0.0/microsoft.netcore.platforms.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/microsoft.win32.registry/5.0.0/microsoft.win32.registry.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/mongodb.bson/3.1.0/mongodb.bson.3.1.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/mongodb.driver/3.1.0/mongodb.driver.3.1.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg.sha512",
"/Users/fantasy/.nuget/packages/nlog/5.3.4/nlog.5.3.4.nupkg.sha512",
"/Users/fantasy/.nuget/packages/protobuf-net/3.2.45/protobuf-net.3.2.45.nupkg.sha512",
"/Users/fantasy/.nuget/packages/protobuf-net.core/3.2.45/protobuf-net.core.3.2.45.nupkg.sha512",
"/Users/fantasy/.nuget/packages/sharpcompress/0.30.1/sharpcompress.0.30.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/snappier/1.0.0/snappier.1.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.buffers/4.5.1/system.buffers.4.5.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.collections.immutable/7.0.0/system.collections.immutable.7.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.io.pipelines/9.0.0/system.io.pipelines.9.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.memory/4.5.5/system.memory.4.5.5.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.runtime.compilerservices.unsafe/5.0.0/system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.security.accesscontrol/5.0.0/system.security.accesscontrol.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.security.principal.windows/5.0.0/system.security.principal.windows.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/zstdsharp.port/0.7.3/zstdsharp.port.0.7.3.nupkg.sha512"
],
"logs": []
}

View File

@@ -0,0 +1 @@
"restore":{"projectUniqueName":"/Users/fantasy/Movies/邮件系统/Lession/Server/App/App.csproj","projectName":"App","projectPath":"/Users/fantasy/Movies/邮件系统/Lession/Server/App/App.csproj","outputPath":"/Users/fantasy/Movies/邮件系统/Lession/Server/App/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"/usr/local/share/dotnet/library-packs":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj":{"projectPath":"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj"},"/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/Hotfix.csproj":{"projectPath":"/Users/fantasy/Movies/邮件系统/Lession/Server/Hotfix/Hotfix.csproj"}}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"all"},"SdkAnalysisLevel":"9.0.100"}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Fantasy-Net.NLog":{"target":"Package","version":"[2024.1.20, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/9.0.100/PortableRuntimeIdentifierGraph.json"}}

View File

@@ -0,0 +1 @@
17392438089775705

View File

@@ -0,0 +1 @@
17392438089775705

Binary file not shown.

View File

@@ -0,0 +1,39 @@
using System.Runtime.Loader;
namespace Fantasy;
public static class AssemblyHelper
{
private const string HotfixDll = "Hotfix";
private static AssemblyLoadContext? _assemblyLoadContext = null;
public static System.Reflection.Assembly[] Assemblies
{
get
{
var assemblies = new System.Reflection.Assembly[2];
assemblies[0] = LoadEntityAssembly();
assemblies[1] = LoadHotfixAssembly();
return assemblies;
}
}
private static System.Reflection.Assembly LoadEntityAssembly()
{
return typeof(AssemblyHelper).Assembly;
}
private static System.Reflection.Assembly LoadHotfixAssembly()
{
if (_assemblyLoadContext != null)
{
_assemblyLoadContext.Unload();
System.GC.Collect();
}
_assemblyLoadContext = new AssemblyLoadContext(HotfixDll, true);
var dllBytes = File.ReadAllBytes(Path.Combine(Environment.CurrentDirectory, $"{HotfixDll}.dll"));
var pdbBytes = File.ReadAllBytes(Path.Combine(Environment.CurrentDirectory, $"{HotfixDll}.pdb"));
return _assemblyLoadContext.LoadFromStream(new MemoryStream(dllBytes), new MemoryStream(pdbBytes));
}
}

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Fantasy-Net" Version="2024.2.22" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,6 @@
namespace Fantasy;
public static class CoroutineLockConst
{
public const long LoginKey = 1;
}

View File

@@ -0,0 +1,12 @@
using Fantasy.Entitas;
using MongoDB.Bson.Serialization.Attributes;
namespace Fantasy;
public sealed class Account : Entity
{
public string Name;
public long CreateTime;
[BsonIgnore]
public long MailRouteId;
}

View File

@@ -0,0 +1,8 @@
using Fantasy.Entitas;
namespace Fantasy;
public sealed class GateAccountFlagComponent : Entity
{
public Account Account;
}

Binary file not shown.

View File

@@ -0,0 +1,29 @@
namespace Fantasy
{
// 生成器自动生成,请不要手动编辑。
public static class SceneType
{
public const int Authentication = 1;
public const int Addressable = 2;
public const int Gate = 3;
public const int Map = 4;
public const int CopyDispatcher = 5;
public const int CopyManager = 6;
public const int Copy = 7;
public const int Chat = 8;
public const int Mail = 9;
public static readonly Dictionary<string, int> SceneTypeDic = new Dictionary<string, int>()
{
{ "Authentication", 1 },
{ "Addressable", 2 },
{ "Gate", 3 },
{ "Map", 4 },
{ "CopyDispatcher", 5 },
{ "CopyManager", 6 },
{ "Copy", 7 },
{ "Chat", 8 },
{ "Mail", 9 },
};
}
}

View File

@@ -0,0 +1,171 @@
using ProtoBuf;
using System.Collections.Generic;
using MongoDB.Bson.Serialization.Attributes;
using Fantasy;
using Fantasy.Network.Interface;
using Fantasy.Serialize;
// ReSharper disable InconsistentNaming
// ReSharper disable RedundantUsingDirective
// ReSharper disable RedundantOverriddenMember
// ReSharper disable PartialTypeWithSinglePart
// ReSharper disable UnusedAutoPropertyAccessor.Global
// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable CheckNamespace
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
#pragma warning disable CS8618
namespace Fantasy
{
/// <summary>
/// Gate服务器登陆到Mail服务器
/// </summary>
[ProtoContract]
public partial class G2Mail_LoginRequest : AMessage, IRouteRequest, IProto
{
public static G2Mail_LoginRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<G2Mail_LoginRequest>();
}
public override void Dispose()
{
Name = default;
AccountId = default;
CreateTime = default;
GateRouteId = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<G2Mail_LoginRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2G_LoginResponse ResponseType { get; set; }
public uint OpCode() { return InnerOpcode.G2Mail_LoginRequest; }
[ProtoMember(1)]
public string Name { get; set; }
[ProtoMember(2)]
public long AccountId { get; set; }
[ProtoMember(3)]
public long CreateTime { get; set; }
[ProtoMember(4)]
public long GateRouteId { get; set; }
}
[ProtoContract]
public partial class Mail2G_LoginResponse : AMessage, IRouteResponse, IProto
{
public static Mail2G_LoginResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2G_LoginResponse>();
}
public override void Dispose()
{
ErrorCode = default;
MailUnitRouteId = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2G_LoginResponse>(this);
#endif
}
public uint OpCode() { return InnerOpcode.Mail2G_LoginResponse; }
[ProtoMember(1)]
public long MailUnitRouteId { get; set; }
[ProtoMember(2)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 发送一个Gate服务器发送给Mail之间的测试协议
/// </summary>
[ProtoContract]
public partial class G2Mail_TestMessage : AMessage, IRouteMessage, IProto
{
public static G2Mail_TestMessage Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<G2Mail_TestMessage>();
}
public override void Dispose()
{
Tag = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<G2Mail_TestMessage>(this);
#endif
}
public uint OpCode() { return InnerOpcode.G2Mail_TestMessage; }
[ProtoMember(1)]
public string Tag { get; set; }
}
/// <summary>
/// 发送给Mail服务器进行下线
/// </summary>
[ProtoContract]
public partial class G2Mail_ExitRequest : AMessage, IRouteRequest, IProto
{
public static G2Mail_ExitRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<G2Mail_ExitRequest>();
}
public override void Dispose()
{
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<G2Mail_ExitRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2G_ExitResponse ResponseType { get; set; }
public uint OpCode() { return InnerOpcode.G2Mail_ExitRequest; }
}
[ProtoContract]
public partial class Mail2G_ExitResponse : AMessage, IRouteResponse, IProto
{
public static Mail2G_ExitResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2G_ExitResponse>();
}
public override void Dispose()
{
ErrorCode = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2G_ExitResponse>(this);
#endif
}
public uint OpCode() { return InnerOpcode.Mail2G_ExitResponse; }
[ProtoMember(1)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 其他服务器发送邮件
/// </summary>
public partial class Other2Mail_SendMailRequest : AMessage, IRouteRequest
{
public static Other2Mail_SendMailRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Other2Mail_SendMailRequest>();
}
public override void Dispose()
{
MailBox = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Other2Mail_SendMailRequest>(this);
#endif
}
[BsonIgnore]
public Mail2Other_SendMailResponse ResponseType { get; set; }
public uint OpCode() { return InnerOpcode.Other2Mail_SendMailRequest; }
public MailBox MailBox { get; set; }
}
[ProtoContract]
public partial class Mail2Other_SendMailResponse : AMessage, IRouteResponse, IProto
{
public static Mail2Other_SendMailResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2Other_SendMailResponse>();
}
public override void Dispose()
{
ErrorCode = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2Other_SendMailResponse>(this);
#endif
}
public uint OpCode() { return InnerOpcode.Mail2Other_SendMailResponse; }
[ProtoMember(1)]
public uint ErrorCode { get; set; }
}
}

View File

@@ -0,0 +1,13 @@
namespace Fantasy
{
public static partial class InnerOpcode
{
public const uint G2Mail_LoginRequest = 1073751825;
public const uint Mail2G_LoginResponse = 1207969553;
public const uint G2Mail_TestMessage = 939534097;
public const uint G2Mail_ExitRequest = 1073751826;
public const uint Mail2G_ExitResponse = 1207969554;
public const uint Other2Mail_SendMailRequest = 1082140435;
public const uint Mail2Other_SendMailResponse = 1207969555;
}
}

View File

@@ -0,0 +1,524 @@
using ProtoBuf;
using System.Collections.Generic;
using MongoDB.Bson.Serialization.Attributes;
using Fantasy;
using Fantasy.Network.Interface;
using Fantasy.Serialize;
// ReSharper disable InconsistentNaming
// ReSharper disable RedundantUsingDirective
// ReSharper disable RedundantOverriddenMember
// ReSharper disable PartialTypeWithSinglePart
// ReSharper disable UnusedAutoPropertyAccessor.Global
// ReSharper disable MemberCanBePrivate.Global
// ReSharper disable CheckNamespace
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
#pragma warning disable CS8618
namespace Fantasy
{
/// <summary>
/// 登陆到Gate服务器
/// </summary>
[ProtoContract]
public partial class C2G_LoginRequest : AMessage, IRequest, IProto
{
public static C2G_LoginRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2G_LoginRequest>();
}
public override void Dispose()
{
Name = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2G_LoginRequest>(this);
#endif
}
[ProtoIgnore]
public G2C_LoginResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2G_LoginRequest; }
[ProtoMember(1)]
public string Name { get; set; }
}
[ProtoContract]
public partial class G2C_LoginResponse : AMessage, IResponse, IProto
{
public static G2C_LoginResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<G2C_LoginResponse>();
}
public override void Dispose()
{
ErrorCode = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<G2C_LoginResponse>(this);
#endif
}
public uint OpCode() { return OuterOpcode.G2C_LoginResponse; }
[ProtoMember(1)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 客户端通知服务器退出游戏
/// </summary>
[ProtoContract]
public partial class C2G_Exit : AMessage, IMessage, IProto
{
public static C2G_Exit Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2G_Exit>();
}
public override void Dispose()
{
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2G_Exit>(this);
#endif
}
public uint OpCode() { return OuterOpcode.C2G_Exit; }
}
/// <summary>
/// 测试Mail自定义Route协议
/// </summary>
[ProtoContract]
public partial class C2Mail_TestRequest : AMessage, ICustomRouteRequest, IProto
{
public static C2Mail_TestRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Mail_TestRequest>();
}
public override void Dispose()
{
Tag = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Mail_TestRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2C_TestResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2Mail_TestRequest; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
[ProtoMember(1)]
public string Tag { get; set; }
}
[ProtoContract]
public partial class Mail2C_TestResponse : AMessage, ICustomRouteResponse, IProto
{
public static Mail2C_TestResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_TestResponse>();
}
public override void Dispose()
{
ErrorCode = default;
Tag = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_TestResponse>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_TestResponse; }
[ProtoMember(1)]
public string Tag { get; set; }
[ProtoMember(2)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 一个邮件的完整信息
/// </summary>
[ProtoContract]
public partial class MailInfo : AMessage, IProto
{
public static MailInfo Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<MailInfo>();
}
public override void Dispose()
{
MailId = default;
OwnerId = default;
Title = default;
Content = default;
CreateTime = default;
ExpireTime = default;
Money = default;
MailState = default;
MailType = default;
Items.Clear();
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<MailInfo>(this);
#endif
}
[ProtoMember(1)]
public long MailId { get; set; }
[ProtoMember(2)]
public long OwnerId { get; set; }
[ProtoMember(3)]
public string Title { get; set; }
[ProtoMember(4)]
public string Content { get; set; }
[ProtoMember(5)]
public long CreateTime { get; set; }
[ProtoMember(6)]
public long ExpireTime { get; set; }
[ProtoMember(7)]
public int Money { get; set; }
[ProtoMember(8)]
public int MailState { get; set; }
[ProtoMember(9)]
public int MailType { get; set; }
[ProtoMember(10)]
public List<ItemInfo> Items = new List<ItemInfo>();
}
/// <summary>
/// 一个邮件的简单版消息
/// </summary>
[ProtoContract]
public partial class MailSimplifyInfo : AMessage, IProto
{
public static MailSimplifyInfo Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<MailSimplifyInfo>();
}
public override void Dispose()
{
MailId = default;
OwnerId = default;
Title = default;
Content = default;
CreateTime = default;
ExpireTime = default;
MailState = default;
MailType = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<MailSimplifyInfo>(this);
#endif
}
[ProtoMember(1)]
public long MailId { get; set; }
[ProtoMember(2)]
public long OwnerId { get; set; }
[ProtoMember(3)]
public string Title { get; set; }
[ProtoMember(4)]
public string Content { get; set; }
[ProtoMember(5)]
public long CreateTime { get; set; }
[ProtoMember(6)]
public long ExpireTime { get; set; }
[ProtoMember(7)]
public int MailState { get; set; }
[ProtoMember(8)]
public int MailType { get; set; }
}
/// <summary>
/// 一个简单的物品信息
/// </summary>
[ProtoContract]
public partial class ItemInfo : AMessage, IProto
{
public static ItemInfo Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<ItemInfo>();
}
public override void Dispose()
{
ItemId = default;
Name = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<ItemInfo>(this);
#endif
}
[ProtoMember(1)]
public long ItemId { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
}
/// <summary>
/// Mail通知客户端有新的邮件
/// </summary>
[ProtoContract]
public partial class Mail2C_HaveMail : AMessage, ICustomRouteMessage, IProto
{
public static Mail2C_HaveMail Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_HaveMail>();
}
public override void Dispose()
{
Mail = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_HaveMail>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_HaveMail; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
[ProtoMember(1)]
public MailSimplifyInfo Mail { get; set; }
}
/// <summary>
/// Mail通知客户端邮件状态变化
/// </summary>
[ProtoContract]
public partial class Mail2C_MailState : AMessage, ICustomRouteMessage, IProto
{
public static Mail2C_MailState Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_MailState>();
}
public override void Dispose()
{
MailState = default;
MailId = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_MailState>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_MailState; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
[ProtoMember(1)]
public int MailState { get; set; }
[ProtoMember(2)]
public long MailId { get; set; }
}
/// <summary>
/// 客户端获取档期所有邮件的信息
/// </summary>
[ProtoContract]
public partial class C2Mail_GetHaveMailRequest : AMessage, ICustomRouteRequest, IProto
{
public static C2Mail_GetHaveMailRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Mail_GetHaveMailRequest>();
}
public override void Dispose()
{
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Mail_GetHaveMailRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2C_GetHaveMailResposne ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2Mail_GetHaveMailRequest; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
}
[ProtoContract]
public partial class Mail2C_GetHaveMailResposne : AMessage, ICustomRouteResponse, IProto
{
public static Mail2C_GetHaveMailResposne Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_GetHaveMailResposne>();
}
public override void Dispose()
{
ErrorCode = default;
Mails.Clear();
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_GetHaveMailResposne>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_GetHaveMailResposne; }
[ProtoMember(1)]
public List<MailSimplifyInfo> Mails = new List<MailSimplifyInfo>();
[ProtoMember(2)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 客户端发开一个邮件
/// </summary>
[ProtoContract]
public partial class C2Mail_OpenMailRequest : AMessage, ICustomRouteRequest, IProto
{
public static C2Mail_OpenMailRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Mail_OpenMailRequest>();
}
public override void Dispose()
{
MailId = default;
ReturnMailInfo = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Mail_OpenMailRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2C_OpenMailResposne ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2Mail_OpenMailRequest; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
[ProtoMember(1)]
public long MailId { get; set; }
[ProtoMember(2)]
public bool ReturnMailInfo { get; set; }
}
[ProtoContract]
public partial class Mail2C_OpenMailResposne : AMessage, ICustomRouteResponse, IProto
{
public static Mail2C_OpenMailResposne Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_OpenMailResposne>();
}
public override void Dispose()
{
ErrorCode = default;
MailInfo = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_OpenMailResposne>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_OpenMailResposne; }
[ProtoMember(1)]
public MailInfo MailInfo { get; set; }
[ProtoMember(2)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 客户端领取邮件的附件
/// </summary>
[ProtoContract]
public partial class C2Mail_ReceiveMailRequest : AMessage, ICustomRouteRequest, IProto
{
public static C2Mail_ReceiveMailRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Mail_ReceiveMailRequest>();
}
public override void Dispose()
{
MailId = default;
Money = default;
ItemId.Clear();
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Mail_ReceiveMailRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2C_ReceiveMailResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2Mail_ReceiveMailRequest; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
[ProtoMember(1)]
public long MailId { get; set; }
[ProtoMember(2)]
public bool Money { get; set; }
[ProtoMember(3)]
public List<long> ItemId = new List<long>();
}
[ProtoContract]
public partial class Mail2C_ReceiveMailResponse : AMessage, ICustomRouteResponse, IProto
{
public static Mail2C_ReceiveMailResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_ReceiveMailResponse>();
}
public override void Dispose()
{
ErrorCode = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_ReceiveMailResponse>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_ReceiveMailResponse; }
[ProtoMember(1)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 客户端通知服务器删除一个邮件
/// </summary>
[ProtoContract]
public partial class C2Mail_RemoveMailRequest : AMessage, ICustomRouteRequest, IProto
{
public static C2Mail_RemoveMailRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Mail_RemoveMailRequest>();
}
public override void Dispose()
{
MailId = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Mail_RemoveMailRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2C_RemoveMailResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2Mail_RemoveMailRequest; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
[ProtoMember(1)]
public long MailId { get; set; }
}
[ProtoContract]
public partial class Mail2C_RemoveMailResponse : AMessage, ICustomRouteResponse, IProto
{
public static Mail2C_RemoveMailResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_RemoveMailResponse>();
}
public override void Dispose()
{
ErrorCode = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_RemoveMailResponse>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_RemoveMailResponse; }
[ProtoMember(1)]
public uint ErrorCode { get; set; }
}
/// <summary>
/// 客户端玩家发送邮件到另外一个玩家
/// </summary>
[ProtoContract]
public partial class C2Mail_SendMailRequest : AMessage, ICustomRouteRequest, IProto
{
public static C2Mail_SendMailRequest Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<C2Mail_SendMailRequest>();
}
public override void Dispose()
{
UserName = default;
Title = default;
Content = default;
Money = default;
ItemId.Clear();
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<C2Mail_SendMailRequest>(this);
#endif
}
[ProtoIgnore]
public Mail2C_SendMailResponse ResponseType { get; set; }
public uint OpCode() { return OuterOpcode.C2Mail_SendMailRequest; }
[ProtoIgnore]
public int RouteType => Fantasy.RouteType.MailRoute;
[ProtoMember(1)]
public string UserName { get; set; }
[ProtoMember(2)]
public string Title { get; set; }
[ProtoMember(3)]
public string Content { get; set; }
[ProtoMember(4)]
public int Money { get; set; }
[ProtoMember(5)]
public List<long> ItemId = new List<long>();
}
[ProtoContract]
public partial class Mail2C_SendMailResponse : AMessage, ICustomRouteResponse, IProto
{
public static Mail2C_SendMailResponse Create(Scene scene)
{
return scene.MessagePoolComponent.Rent<Mail2C_SendMailResponse>();
}
public override void Dispose()
{
ErrorCode = default;
#if FANTASY_NET || FANTASY_UNITY
GetScene().MessagePoolComponent.Return<Mail2C_SendMailResponse>(this);
#endif
}
public uint OpCode() { return OuterOpcode.Mail2C_SendMailResponse; }
[ProtoMember(1)]
public uint ErrorCode { get; set; }
}
}

View File

@@ -0,0 +1,23 @@
namespace Fantasy
{
public static partial class OuterOpcode
{
public const uint C2G_LoginRequest = 268445457;
public const uint G2C_LoginResponse = 402663185;
public const uint C2G_Exit = 134227729;
public const uint C2Mail_TestRequest = 2281711377;
public const uint Mail2C_TestResponse = 2415929105;
public const uint Mail2C_HaveMail = 2147493649;
public const uint Mail2C_MailState = 2147493650;
public const uint C2Mail_GetHaveMailRequest = 2281711378;
public const uint Mail2C_GetHaveMailResposne = 2415929106;
public const uint C2Mail_OpenMailRequest = 2281711379;
public const uint Mail2C_OpenMailResposne = 2415929107;
public const uint C2Mail_ReceiveMailRequest = 2281711380;
public const uint Mail2C_ReceiveMailResponse = 2415929108;
public const uint C2Mail_RemoveMailRequest = 2281711381;
public const uint Mail2C_RemoveMailResponse = 2415929109;
public const uint C2Mail_SendMailRequest = 2281711382;
public const uint Mail2C_SendMailResponse = 2415929110;
}
}

View File

@@ -0,0 +1,8 @@
namespace Fantasy
{
// Route协议定义(需要定义1000以上、因为1000以内的框架预留)
public static class RouteType
{
public const int MailRoute = 1001; // Mail
}
}

View File

@@ -0,0 +1,28 @@
using Fantasy.DataStructure.Collection;
using Fantasy.Entitas;
namespace Fantasy;
/// <summary>
/// 邮件物流中转中心,用来存放所有离线的邮件。
/// 玩家可以在上线的第一时间去这里领取属于自己的邮件。
/// </summary>
public class MailBoxManageComponent : Entity
{
// 定时清楚过期邮件的时间
public const int MailCheckTIme = 10000;
// 存放所有邮箱都会在这里,包括发送给个人的和所有人的邮件。
public readonly Dictionary<long, MailBox> MailBoxes = new Dictionary<long, MailBox>();
// 个人领取邮件列表
public readonly OneToManyList<long, MailBox> MailsByAccount = new OneToManyList<long, MailBox>();
// 按照邮件箱类型存储
public readonly OneToManyList<int, MailBox> MailsByMailBoxType = new OneToManyList<int, MailBox>();
// 按照时间排序的邮件箱
public readonly SortedOneToManyList<long, long> Timers = new SortedOneToManyList<long, long>();
// 临时的存放过期时间的队列
public readonly Queue<long> TimeOutQueue = new Queue<long>();
// 时间任务的Id
public long TimerId;
// 最小的时间
public long MinTime;
}

View File

@@ -0,0 +1,23 @@
using Fantasy.DataStructure.Collection;
using Fantasy.Entitas;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson.Serialization.Options;
namespace Fantasy;
/// <summary>
/// 这个代表一个用户身上所有邮件的组件
/// </summary>
public sealed class MailComponent : Entity
{
// 最大的邮件数量
public const int MaxMailCount = 50;
// 邮件的过期时间,这个是过期7天时间。
public const int MailExpireTime = 1000 * 60 * 60 * 24 * 7;
// 玩家的邮件
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
public Dictionary<long, Mail> Mails = new Dictionary<long, Mail>();
// 按照时间进行排序
[BsonIgnore]
public readonly SortedOneToManyList<long, long> Timer = new SortedOneToManyList<long, long>();
}

View File

@@ -0,0 +1,10 @@
using Fantasy.Entitas;
namespace Fantasy;
public sealed class MailUnitManageComponent : Entity
{
public readonly Dictionary<long, MailUnit> Online = new Dictionary<long, MailUnit>();
public readonly Dictionary<string, MailUnit> UnitByName = new Dictionary<string, MailUnit>();
public readonly Dictionary<long, MailUnit> UnitByAccountId = new Dictionary<long, MailUnit>();
}

View File

@@ -0,0 +1,8 @@
using Fantasy.Entitas;
namespace Fantasy;
public sealed class Item : Entity
{
public string Name;
}

View File

@@ -0,0 +1,25 @@
using Fantasy.Entitas;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Bson.Serialization.Options;
namespace Fantasy;
/// <summary>
/// 代表游戏中的一封邮件实体
/// </summary>
public sealed class Mail : Entity
{
// 这个代表里游戏中的一封邮件
// 标题、内容、金钱、物品
public long OwnerId; // 邮件拥有者的Id(AccountId、UnitId、RoleId)
public string Title; // 邮件的标题
public string Content; // 邮件的内容
public long CreateTime; // 邮件的创建时间
public long ExpireTime; // 邮件的过期时间(决定这个实体的生命周期)
public int Money; // 邮件的中钱
public MailState MailState; // 邮件的状态
public MailType MailType; // 邮件的类型
public List<Item> Items = new List<Item>(); // 邮件中的物品
// [BsonDictionaryOptions(DictionaryRepresentation.ArrayOfArrays)]
// public Dictionary<long,Item> Items = new Dictionary<long,Item>();
}

View File

@@ -0,0 +1,24 @@
using Fantasy.Entitas;
namespace Fantasy;
/// <summary>
/// 邮件箱
/// </summary>
public sealed class MailBox : Entity
{
// 快递
// 快递包装、用盒子。然后这个盒子上有一个标签、收件人、发件人、快递的公司。
// 这个盒子了。可以装任何不同种类的东西。
// 一对一、我发一个快递,给张三和李四。
// 但是邮件可能会有这个的功能,比如给某一个范围的人发送同一份邮件,比如补偿、或者奖励。
public Mail Mail; // 邮件
public long CreateTime; // 箱子的创建时间
public long ExpireTime; // 箱子的过期时间
public MailBoxType MailBoxType; // 箱子的类型
public HashSet<long> AccountId = new HashSet<long>(); // 收件人
public HashSet<long> Received = new HashSet<long>(); // 领取过的人
public long SendAccountId; // 发件人/发送人
}

View File

@@ -0,0 +1,13 @@
using Fantasy.Entitas;
using MongoDB.Bson.Serialization.Attributes;
namespace Fantasy;
public sealed class MailUnit : Entity
{
public string Name;
public long AccountId;
public long CreateTime;
[BsonIgnore]
public long GateRouteId;
}

View File

@@ -0,0 +1,37 @@
using CommandLine;
namespace Fantasy;
public enum MailType
{
None = 0,
System = 1, // 系统邮件
Rewards = 2, // 奖励邮件(擂台、有奖问答)
User = 3, // 个人邮件(玩家给玩家之间发送)
}
public enum MailState
{
None = 0,
Unread = 1, // 未读
HaveRead = 2, // 已读
NotClaimed = 3, // 未领取
Received = 4, // 已领取
}
public enum MailBoxType
{
None = 0,
Specify = 1, // 指定目标
Online = 2, // 给在线所有人发送邮件
All = 3, // 所有人
AllToDate = 4, // 根据玩家注册的时间发送邮件
}
public enum MailRemoveActionType
{
None = 0,
Remove = 1, // 手动移除
ExpireTimeRemove = 2, // 过期时间移除
Overtop = 3, // 超过邮件上限移除
}

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,318 @@
{
"runtimeTarget": {
"name": ".NETCoreApp,Version=v8.0",
"signature": ""
},
"compilationOptions": {},
"targets": {
".NETCoreApp,Version=v8.0": {
"Entity/1.0.0": {
"dependencies": {
"Fantasy-Net": "2024.2.22"
},
"runtime": {
"Entity.dll": {}
}
},
"CommandLineParser/2.9.1": {
"runtime": {
"lib/netstandard2.0/CommandLine.dll": {
"assemblyVersion": "2.9.1.0",
"fileVersion": "2.9.1.0"
}
}
},
"DnsClient/1.6.1": {
"dependencies": {
"Microsoft.Win32.Registry": "5.0.0"
},
"runtime": {
"lib/net5.0/DnsClient.dll": {
"assemblyVersion": "1.6.1.0",
"fileVersion": "1.6.1.0"
}
}
},
"Fantasy-Net/2024.2.22": {
"dependencies": {
"CommandLineParser": "2.9.1",
"MongoDB.Bson": "3.1.0",
"MongoDB.Driver": "3.1.0",
"Newtonsoft.Json": "13.0.3",
"System.IO.Pipelines": "9.0.0",
"protobuf-net": "3.2.45"
},
"runtime": {
"lib/net8.0/Fantasy-Net.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"Microsoft.Extensions.Logging.Abstractions/2.0.0": {},
"Microsoft.NETCore.Platforms/5.0.0": {},
"Microsoft.Win32.Registry/5.0.0": {
"dependencies": {
"System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
}
},
"MongoDB.Bson/3.1.0": {
"dependencies": {
"System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "5.0.0"
},
"runtime": {
"lib/net6.0/MongoDB.Bson.dll": {
"assemblyVersion": "3.1.0.0",
"fileVersion": "3.1.0.0"
}
}
},
"MongoDB.Driver/3.1.0": {
"dependencies": {
"DnsClient": "1.6.1",
"Microsoft.Extensions.Logging.Abstractions": "2.0.0",
"MongoDB.Bson": "3.1.0",
"SharpCompress": "0.30.1",
"Snappier": "1.0.0",
"System.Buffers": "4.5.1",
"ZstdSharp.Port": "0.7.3"
},
"runtime": {
"lib/net6.0/MongoDB.Driver.dll": {
"assemblyVersion": "3.1.0.0",
"fileVersion": "3.1.0.0"
}
}
},
"Newtonsoft.Json/13.0.3": {
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"assemblyVersion": "13.0.0.0",
"fileVersion": "13.0.3.27908"
}
}
},
"protobuf-net/3.2.45": {
"dependencies": {
"protobuf-net.Core": "3.2.45"
},
"runtime": {
"lib/net6.0/protobuf-net.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.2.45.36865"
}
}
},
"protobuf-net.Core/3.2.45": {
"dependencies": {
"System.Collections.Immutable": "7.0.0"
},
"runtime": {
"lib/net6.0/protobuf-net.Core.dll": {
"assemblyVersion": "3.0.0.0",
"fileVersion": "3.2.45.36865"
}
}
},
"SharpCompress/0.30.1": {
"runtime": {
"lib/net5.0/SharpCompress.dll": {
"assemblyVersion": "0.30.1.0",
"fileVersion": "0.30.1.0"
}
}
},
"Snappier/1.0.0": {
"runtime": {
"lib/net5.0/Snappier.dll": {
"assemblyVersion": "1.0.0.0",
"fileVersion": "1.0.0.0"
}
}
},
"System.Buffers/4.5.1": {},
"System.Collections.Immutable/7.0.0": {},
"System.IO.Pipelines/9.0.0": {
"runtime": {
"lib/net8.0/System.IO.Pipelines.dll": {
"assemblyVersion": "9.0.0.0",
"fileVersion": "9.0.24.52809"
}
}
},
"System.Memory/4.5.5": {},
"System.Runtime.CompilerServices.Unsafe/5.0.0": {},
"System.Security.AccessControl/5.0.0": {
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
}
},
"System.Security.Principal.Windows/5.0.0": {},
"ZstdSharp.Port/0.7.3": {
"runtime": {
"lib/net7.0/ZstdSharp.dll": {
"assemblyVersion": "0.7.3.0",
"fileVersion": "0.7.3.0"
}
}
}
}
},
"libraries": {
"Entity/1.0.0": {
"type": "project",
"serviceable": false,
"sha512": ""
},
"CommandLineParser/2.9.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==",
"path": "commandlineparser/2.9.1",
"hashPath": "commandlineparser.2.9.1.nupkg.sha512"
},
"DnsClient/1.6.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==",
"path": "dnsclient/1.6.1",
"hashPath": "dnsclient.1.6.1.nupkg.sha512"
},
"Fantasy-Net/2024.2.22": {
"type": "package",
"serviceable": true,
"sha512": "sha512-cT6B0YJ5JmbPHBLYgLeVgg2WbXYxxa1tudoIase88uMzAuqU9t7EQ7dFZGSWjP41c5JOQ/0f1q9lzGWTh/hskw==",
"path": "fantasy-net/2024.2.22",
"hashPath": "fantasy-net.2024.2.22.nupkg.sha512"
},
"Microsoft.Extensions.Logging.Abstractions/2.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-6ZCllUYGFukkymSTx3Yr0G/ajRxoNJp7/FqSxSB4fGISST54ifBhgu4Nc0ItGi3i6DqwuNd8SUyObmiC++AO2Q==",
"path": "microsoft.extensions.logging.abstractions/2.0.0",
"hashPath": "microsoft.extensions.logging.abstractions.2.0.0.nupkg.sha512"
},
"Microsoft.NETCore.Platforms/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
"path": "microsoft.netcore.platforms/5.0.0",
"hashPath": "microsoft.netcore.platforms.5.0.0.nupkg.sha512"
},
"Microsoft.Win32.Registry/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
"path": "microsoft.win32.registry/5.0.0",
"hashPath": "microsoft.win32.registry.5.0.0.nupkg.sha512"
},
"MongoDB.Bson/3.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-3dhaZhz18B5vUoEP13o2j8A6zQfkHdZhwBvLZEjDJum4BTLLv1/Z8bt25UQEtpqvYwLgde4R6ekWZ7XAYUMxuw==",
"path": "mongodb.bson/3.1.0",
"hashPath": "mongodb.bson.3.1.0.nupkg.sha512"
},
"MongoDB.Driver/3.1.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-+O7lKaIl7VUHptE0hqTd7UY1G5KDp/o8S4upG7YL4uChMNKD/U6tz9i17nMGHaD/L2AiPLgaJcaDe2XACsegGA==",
"path": "mongodb.driver/3.1.0",
"hashPath": "mongodb.driver.3.1.0.nupkg.sha512"
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"path": "newtonsoft.json/13.0.3",
"hashPath": "newtonsoft.json.13.0.3.nupkg.sha512"
},
"protobuf-net/3.2.45": {
"type": "package",
"serviceable": true,
"sha512": "sha512-5UZ/ukUHcGbFSl7vNMrHsfjqdxusdd9w7w0fCEXzf3UUtsrGNVCzV5SmF+sCHAbnRV2qPcD1ixiDP7Aj8lX/HA==",
"path": "protobuf-net/3.2.45",
"hashPath": "protobuf-net.3.2.45.nupkg.sha512"
},
"protobuf-net.Core/3.2.45": {
"type": "package",
"serviceable": true,
"sha512": "sha512-PMWatW2NrT1uTXD7etJ4VdQ0wWZLFrIfdRGppD2QX7nzZ0+kIzqhq551u6ZiXJHWJgG4hWFEkSnUnt2aB6posg==",
"path": "protobuf-net.core/3.2.45",
"hashPath": "protobuf-net.core.3.2.45.nupkg.sha512"
},
"SharpCompress/0.30.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XqD4TpfyYGa7QTPzaGlMVbcecKnXy4YmYLDWrU+JIj7IuRNl7DH2END+Ll7ekWIY8o3dAMWLFDE1xdhfIWD1nw==",
"path": "sharpcompress/0.30.1",
"hashPath": "sharpcompress.0.30.1.nupkg.sha512"
},
"Snappier/1.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-rFtK2KEI9hIe8gtx3a0YDXdHOpedIf9wYCEYtBEmtlyiWVX3XlCNV03JrmmAi/Cdfn7dxK+k0sjjcLv4fpHnqA==",
"path": "snappier/1.0.0",
"hashPath": "snappier.1.0.0.nupkg.sha512"
},
"System.Buffers/4.5.1": {
"type": "package",
"serviceable": true,
"sha512": "sha512-Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==",
"path": "system.buffers/4.5.1",
"hashPath": "system.buffers.4.5.1.nupkg.sha512"
},
"System.Collections.Immutable/7.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==",
"path": "system.collections.immutable/7.0.0",
"hashPath": "system.collections.immutable.7.0.0.nupkg.sha512"
},
"System.IO.Pipelines/9.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==",
"path": "system.io.pipelines/9.0.0",
"hashPath": "system.io.pipelines.9.0.0.nupkg.sha512"
},
"System.Memory/4.5.5": {
"type": "package",
"serviceable": true,
"sha512": "sha512-XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==",
"path": "system.memory/4.5.5",
"hashPath": "system.memory.4.5.5.nupkg.sha512"
},
"System.Runtime.CompilerServices.Unsafe/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==",
"path": "system.runtime.compilerservices.unsafe/5.0.0",
"hashPath": "system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512"
},
"System.Security.AccessControl/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
"path": "system.security.accesscontrol/5.0.0",
"hashPath": "system.security.accesscontrol.5.0.0.nupkg.sha512"
},
"System.Security.Principal.Windows/5.0.0": {
"type": "package",
"serviceable": true,
"sha512": "sha512-t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==",
"path": "system.security.principal.windows/5.0.0",
"hashPath": "system.security.principal.windows.5.0.0.nupkg.sha512"
},
"ZstdSharp.Port/0.7.3": {
"type": "package",
"serviceable": true,
"sha512": "sha512-U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==",
"path": "zstdsharp.port/0.7.3",
"hashPath": "zstdsharp.port.0.7.3.nupkg.sha512"
}
}
}

View File

@@ -0,0 +1,4 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETCoreApp,Version=v8.0", FrameworkDisplayName = ".NET 8.0")]

View File

@@ -0,0 +1,22 @@
//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("Entity")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("Entity")]
[assembly: System.Reflection.AssemblyTitleAttribute("Entity")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
// 由 MSBuild WriteCodeFragment 类生成。

View File

@@ -0,0 +1 @@
b7ceabf79c524d6ee0475da740239235018950a5f2c92d51c77f832004e64e6c

View File

@@ -0,0 +1,15 @@
is_global = true
build_property.TargetFramework = net8.0
build_property.TargetPlatformMinVersion =
build_property.UsingMicrosoftNETSdkWeb =
build_property.ProjectTypeGuids =
build_property.InvariantGlobalization =
build_property.PlatformNeutralAssembly =
build_property.EnforceExtendedAnalyzerRules =
build_property._SupportedPlatformList = Linux,macOS,Windows
build_property.RootNamespace = Entity
build_property.ProjectDir = /Users/fantasy/Movies/邮件系统/Lession/Server/Entity/
build_property.EnableComHosting =
build_property.EnableGeneratedComInterfaceComImportInterop =
build_property.EffectiveAnalysisLevelStyle = 8.0
build_property.EnableCodeStyleSeverity =

View File

@@ -0,0 +1,8 @@
// <auto-generated/>
global using global::System;
global using global::System.Collections.Generic;
global using global::System.IO;
global using global::System.Linq;
global using global::System.Net.Http;
global using global::System.Threading;
global using global::System.Threading.Tasks;

View File

@@ -0,0 +1 @@
a2b05708cd015f9fdc4519d2f605ab8a519052de738a75c6155c82fb3f874598

View File

@@ -0,0 +1,12 @@
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/bin/Debug/net8.0/Entity.deps.json
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/bin/Debug/net8.0/Entity.dll
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/bin/Debug/net8.0/Entity.pdb
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/Entity.csproj.AssemblyReference.cache
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/Entity.GeneratedMSBuildEditorConfig.editorconfig
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/Entity.AssemblyInfoInputs.cache
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/Entity.AssemblyInfo.cs
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/Entity.csproj.CoreCompileInputs.cache
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/Entity.dll
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/refint/Entity.dll
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/Entity.pdb
/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/Debug/net8.0/ref/Entity.dll

View File

@@ -0,0 +1,74 @@
{
"format": 1,
"restore": {
"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj": {}
},
"projects": {
"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj",
"projectName": "Entity",
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj",
"packagesPath": "/Users/fantasy/.nuget/packages/",
"outputPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/fantasy/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"/usr/local/share/dotnet/library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "all"
},
"SdkAnalysisLevel": "9.0.100"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Fantasy-Net": {
"target": "Package",
"version": "[2024.2.22, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.100/PortableRuntimeIdentifierGraph.json"
}
}
}
}
}

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<RestoreSuccess Condition=" '$(RestoreSuccess)' == '' ">True</RestoreSuccess>
<RestoreTool Condition=" '$(RestoreTool)' == '' ">NuGet</RestoreTool>
<ProjectAssetsFile Condition=" '$(ProjectAssetsFile)' == '' ">$(MSBuildThisFileDirectory)project.assets.json</ProjectAssetsFile>
<NuGetPackageRoot Condition=" '$(NuGetPackageRoot)' == '' ">/Users/fantasy/.nuget/packages/</NuGetPackageRoot>
<NuGetPackageFolders Condition=" '$(NuGetPackageFolders)' == '' ">/Users/fantasy/.nuget/packages/</NuGetPackageFolders>
<NuGetProjectStyle Condition=" '$(NuGetProjectStyle)' == '' ">PackageReference</NuGetProjectStyle>
<NuGetToolVersion Condition=" '$(NuGetToolVersion)' == '' ">6.12.2</NuGetToolVersion>
</PropertyGroup>
<ItemGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<SourceRoot Include="/Users/fantasy/.nuget/packages/" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ImportGroup Condition=" '$(ExcludeRestorePackageImports)' != 'true' ">
<Import Project="$(NuGetPackageRoot)fantasy-net/2024.2.22/buildTransitive/Fantasy-Net.targets" Condition="Exists('$(NuGetPackageRoot)fantasy-net/2024.2.22/buildTransitive/Fantasy-Net.targets')" />
</ImportGroup>
</Project>

View File

@@ -0,0 +1,950 @@
{
"version": 3,
"targets": {
"net8.0": {
"CommandLineParser/2.9.1": {
"type": "package",
"compile": {
"lib/netstandard2.0/CommandLine.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/CommandLine.dll": {
"related": ".xml"
}
}
},
"DnsClient/1.6.1": {
"type": "package",
"dependencies": {
"Microsoft.Win32.Registry": "5.0.0"
},
"compile": {
"lib/net5.0/DnsClient.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net5.0/DnsClient.dll": {
"related": ".xml"
}
}
},
"Fantasy-Net/2024.2.22": {
"type": "package",
"dependencies": {
"CommandLineParser": "2.9.1",
"MongoDB.Bson": "3.1.0",
"MongoDB.Driver": "3.1.0",
"Newtonsoft.Json": "13.0.3",
"System.IO.Pipelines": "9.0.0",
"protobuf-net": "3.2.45"
},
"compile": {
"lib/net8.0/Fantasy-Net.dll": {}
},
"runtime": {
"lib/net8.0/Fantasy-Net.dll": {}
},
"frameworkReferences": [
"Microsoft.AspNetCore.App"
],
"build": {
"buildTransitive/Fantasy-Net.targets": {}
}
},
"Microsoft.Extensions.Logging.Abstractions/2.0.0": {
"type": "package",
"compile": {
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": {
"related": ".xml"
}
}
},
"Microsoft.NETCore.Platforms/5.0.0": {
"type": "package",
"compile": {
"lib/netstandard1.0/_._": {}
},
"runtime": {
"lib/netstandard1.0/_._": {}
}
},
"Microsoft.Win32.Registry/5.0.0": {
"type": "package",
"dependencies": {
"System.Security.AccessControl": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
},
"compile": {
"ref/netstandard2.0/Microsoft.Win32.Registry.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"related": ".xml"
}
},
"runtimeTargets": {
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll": {
"assetType": "runtime",
"rid": "win"
}
}
},
"MongoDB.Bson/3.1.0": {
"type": "package",
"dependencies": {
"System.Memory": "4.5.5",
"System.Runtime.CompilerServices.Unsafe": "5.0.0"
},
"compile": {
"lib/net6.0/MongoDB.Bson.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/MongoDB.Bson.dll": {
"related": ".xml"
}
}
},
"MongoDB.Driver/3.1.0": {
"type": "package",
"dependencies": {
"DnsClient": "1.6.1",
"Microsoft.Extensions.Logging.Abstractions": "2.0.0",
"MongoDB.Bson": "3.1.0",
"SharpCompress": "0.30.1",
"Snappier": "1.0.0",
"System.Buffers": "4.5.1",
"ZstdSharp.Port": "0.7.3"
},
"compile": {
"lib/net6.0/MongoDB.Driver.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/MongoDB.Driver.dll": {
"related": ".xml"
}
}
},
"Newtonsoft.Json/13.0.3": {
"type": "package",
"compile": {
"lib/net6.0/Newtonsoft.Json.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/Newtonsoft.Json.dll": {
"related": ".xml"
}
}
},
"protobuf-net/3.2.45": {
"type": "package",
"dependencies": {
"protobuf-net.Core": "3.2.45"
},
"compile": {
"lib/net6.0/protobuf-net.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/protobuf-net.dll": {
"related": ".xml"
}
}
},
"protobuf-net.Core/3.2.45": {
"type": "package",
"dependencies": {
"System.Collections.Immutable": "7.0.0"
},
"compile": {
"lib/net6.0/protobuf-net.Core.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net6.0/protobuf-net.Core.dll": {
"related": ".xml"
}
}
},
"SharpCompress/0.30.1": {
"type": "package",
"compile": {
"lib/net5.0/SharpCompress.dll": {}
},
"runtime": {
"lib/net5.0/SharpCompress.dll": {}
}
},
"Snappier/1.0.0": {
"type": "package",
"compile": {
"lib/net5.0/Snappier.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net5.0/Snappier.dll": {
"related": ".xml"
}
}
},
"System.Buffers/4.5.1": {
"type": "package",
"compile": {
"ref/netcoreapp2.0/_._": {}
},
"runtime": {
"lib/netcoreapp2.0/_._": {}
}
},
"System.Collections.Immutable/7.0.0": {
"type": "package",
"compile": {
"lib/net7.0/System.Collections.Immutable.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net7.0/System.Collections.Immutable.dll": {
"related": ".xml"
}
},
"build": {
"buildTransitive/net6.0/_._": {}
}
},
"System.IO.Pipelines/9.0.0": {
"type": "package",
"compile": {
"lib/net8.0/System.IO.Pipelines.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/net8.0/System.IO.Pipelines.dll": {
"related": ".xml"
}
},
"build": {
"buildTransitive/net8.0/_._": {}
}
},
"System.Memory/4.5.5": {
"type": "package",
"compile": {
"ref/netcoreapp2.1/_._": {}
},
"runtime": {
"lib/netcoreapp2.1/_._": {}
}
},
"System.Runtime.CompilerServices.Unsafe/5.0.0": {
"type": "package",
"compile": {
"ref/netstandard2.1/System.Runtime.CompilerServices.Unsafe.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": {
"related": ".xml"
}
}
},
"System.Security.AccessControl/5.0.0": {
"type": "package",
"dependencies": {
"Microsoft.NETCore.Platforms": "5.0.0",
"System.Security.Principal.Windows": "5.0.0"
},
"compile": {
"ref/netstandard2.0/System.Security.AccessControl.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/System.Security.AccessControl.dll": {
"related": ".xml"
}
},
"runtimeTargets": {
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll": {
"assetType": "runtime",
"rid": "win"
}
}
},
"System.Security.Principal.Windows/5.0.0": {
"type": "package",
"compile": {
"ref/netcoreapp3.0/System.Security.Principal.Windows.dll": {
"related": ".xml"
}
},
"runtime": {
"lib/netstandard2.0/System.Security.Principal.Windows.dll": {
"related": ".xml"
}
},
"runtimeTargets": {
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"assetType": "runtime",
"rid": "unix"
},
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": {
"assetType": "runtime",
"rid": "win"
}
}
},
"ZstdSharp.Port/0.7.3": {
"type": "package",
"compile": {
"lib/net7.0/ZstdSharp.dll": {}
},
"runtime": {
"lib/net7.0/ZstdSharp.dll": {}
}
}
}
},
"libraries": {
"CommandLineParser/2.9.1": {
"sha512": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA==",
"type": "package",
"path": "commandlineparser/2.9.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"CommandLine20.png",
"License.md",
"README.md",
"commandlineparser.2.9.1.nupkg.sha512",
"commandlineparser.nuspec",
"lib/net40/CommandLine.dll",
"lib/net40/CommandLine.xml",
"lib/net45/CommandLine.dll",
"lib/net45/CommandLine.xml",
"lib/net461/CommandLine.dll",
"lib/net461/CommandLine.xml",
"lib/netstandard2.0/CommandLine.dll",
"lib/netstandard2.0/CommandLine.xml"
]
},
"DnsClient/1.6.1": {
"sha512": "4H/f2uYJOZ+YObZjpY9ABrKZI+JNw3uizp6oMzTXwDw6F+2qIPhpRl/1t68O/6e98+vqNiYGu+lswmwdYUy3gg==",
"type": "package",
"path": "dnsclient/1.6.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"dnsclient.1.6.1.nupkg.sha512",
"dnsclient.nuspec",
"icon.png",
"lib/net45/DnsClient.dll",
"lib/net45/DnsClient.xml",
"lib/net471/DnsClient.dll",
"lib/net471/DnsClient.xml",
"lib/net5.0/DnsClient.dll",
"lib/net5.0/DnsClient.xml",
"lib/netstandard1.3/DnsClient.dll",
"lib/netstandard1.3/DnsClient.xml",
"lib/netstandard2.0/DnsClient.dll",
"lib/netstandard2.0/DnsClient.xml",
"lib/netstandard2.1/DnsClient.dll",
"lib/netstandard2.1/DnsClient.xml"
]
},
"Fantasy-Net/2024.2.22": {
"sha512": "cT6B0YJ5JmbPHBLYgLeVgg2WbXYxxa1tudoIase88uMzAuqU9t7EQ7dFZGSWjP41c5JOQ/0f1q9lzGWTh/hskw==",
"type": "package",
"path": "fantasy-net/2024.2.22",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE",
"README.md",
"buildTransitive/Fantasy-Net.targets",
"fantasy-net.2024.2.22.nupkg.sha512",
"fantasy-net.nuspec",
"icon.png",
"lib/net8.0/Fantasy-Net.dll",
"lib/net9.0/Fantasy-Net.dll"
]
},
"Microsoft.Extensions.Logging.Abstractions/2.0.0": {
"sha512": "6ZCllUYGFukkymSTx3Yr0G/ajRxoNJp7/FqSxSB4fGISST54ifBhgu4Nc0ItGi3i6DqwuNd8SUyObmiC++AO2Q==",
"type": "package",
"path": "microsoft.extensions.logging.abstractions/2.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll",
"lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.xml",
"microsoft.extensions.logging.abstractions.2.0.0.nupkg.sha512",
"microsoft.extensions.logging.abstractions.nuspec"
]
},
"Microsoft.NETCore.Platforms/5.0.0": {
"sha512": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==",
"type": "package",
"path": "microsoft.netcore.platforms/5.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/netstandard1.0/_._",
"microsoft.netcore.platforms.5.0.0.nupkg.sha512",
"microsoft.netcore.platforms.nuspec",
"runtime.json",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"Microsoft.Win32.Registry/5.0.0": {
"sha512": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
"type": "package",
"path": "microsoft.win32.registry/5.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net46/Microsoft.Win32.Registry.dll",
"lib/net461/Microsoft.Win32.Registry.dll",
"lib/net461/Microsoft.Win32.Registry.xml",
"lib/netstandard1.3/Microsoft.Win32.Registry.dll",
"lib/netstandard2.0/Microsoft.Win32.Registry.dll",
"lib/netstandard2.0/Microsoft.Win32.Registry.xml",
"microsoft.win32.registry.5.0.0.nupkg.sha512",
"microsoft.win32.registry.nuspec",
"ref/net46/Microsoft.Win32.Registry.dll",
"ref/net461/Microsoft.Win32.Registry.dll",
"ref/net461/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/Microsoft.Win32.Registry.dll",
"ref/netstandard1.3/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/de/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/es/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/fr/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/it/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/ja/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/ko/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/ru/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/zh-hans/Microsoft.Win32.Registry.xml",
"ref/netstandard1.3/zh-hant/Microsoft.Win32.Registry.xml",
"ref/netstandard2.0/Microsoft.Win32.Registry.dll",
"ref/netstandard2.0/Microsoft.Win32.Registry.xml",
"runtimes/win/lib/net46/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/net461/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/net461/Microsoft.Win32.Registry.xml",
"runtimes/win/lib/netstandard1.3/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.dll",
"runtimes/win/lib/netstandard2.0/Microsoft.Win32.Registry.xml",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"MongoDB.Bson/3.1.0": {
"sha512": "3dhaZhz18B5vUoEP13o2j8A6zQfkHdZhwBvLZEjDJum4BTLLv1/Z8bt25UQEtpqvYwLgde4R6ekWZ7XAYUMxuw==",
"type": "package",
"path": "mongodb.bson/3.1.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"README.md",
"lib/net472/MongoDB.Bson.dll",
"lib/net472/MongoDB.Bson.xml",
"lib/net6.0/MongoDB.Bson.dll",
"lib/net6.0/MongoDB.Bson.xml",
"lib/netstandard2.1/MongoDB.Bson.dll",
"lib/netstandard2.1/MongoDB.Bson.xml",
"mongodb.bson.3.1.0.nupkg.sha512",
"mongodb.bson.nuspec",
"packageIcon.png"
]
},
"MongoDB.Driver/3.1.0": {
"sha512": "+O7lKaIl7VUHptE0hqTd7UY1G5KDp/o8S4upG7YL4uChMNKD/U6tz9i17nMGHaD/L2AiPLgaJcaDe2XACsegGA==",
"type": "package",
"path": "mongodb.driver/3.1.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"README.md",
"lib/net472/MongoDB.Driver.dll",
"lib/net472/MongoDB.Driver.xml",
"lib/net6.0/MongoDB.Driver.dll",
"lib/net6.0/MongoDB.Driver.xml",
"lib/netstandard2.1/MongoDB.Driver.dll",
"lib/netstandard2.1/MongoDB.Driver.xml",
"mongodb.driver.3.1.0.nupkg.sha512",
"mongodb.driver.nuspec",
"packageIcon.png"
]
},
"Newtonsoft.Json/13.0.3": {
"sha512": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==",
"type": "package",
"path": "newtonsoft.json/13.0.3",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.md",
"README.md",
"lib/net20/Newtonsoft.Json.dll",
"lib/net20/Newtonsoft.Json.xml",
"lib/net35/Newtonsoft.Json.dll",
"lib/net35/Newtonsoft.Json.xml",
"lib/net40/Newtonsoft.Json.dll",
"lib/net40/Newtonsoft.Json.xml",
"lib/net45/Newtonsoft.Json.dll",
"lib/net45/Newtonsoft.Json.xml",
"lib/net6.0/Newtonsoft.Json.dll",
"lib/net6.0/Newtonsoft.Json.xml",
"lib/netstandard1.0/Newtonsoft.Json.dll",
"lib/netstandard1.0/Newtonsoft.Json.xml",
"lib/netstandard1.3/Newtonsoft.Json.dll",
"lib/netstandard1.3/Newtonsoft.Json.xml",
"lib/netstandard2.0/Newtonsoft.Json.dll",
"lib/netstandard2.0/Newtonsoft.Json.xml",
"newtonsoft.json.13.0.3.nupkg.sha512",
"newtonsoft.json.nuspec",
"packageIcon.png"
]
},
"protobuf-net/3.2.45": {
"sha512": "5UZ/ukUHcGbFSl7vNMrHsfjqdxusdd9w7w0fCEXzf3UUtsrGNVCzV5SmF+sCHAbnRV2qPcD1ixiDP7Aj8lX/HA==",
"type": "package",
"path": "protobuf-net/3.2.45",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net462/protobuf-net.dll",
"lib/net462/protobuf-net.xml",
"lib/net6.0/protobuf-net.dll",
"lib/net6.0/protobuf-net.xml",
"lib/netstandard2.0/protobuf-net.dll",
"lib/netstandard2.0/protobuf-net.xml",
"lib/netstandard2.1/protobuf-net.dll",
"lib/netstandard2.1/protobuf-net.xml",
"protobuf-net.3.2.45.nupkg.sha512",
"protobuf-net.nuspec",
"protobuf-net.png",
"readme.md"
]
},
"protobuf-net.Core/3.2.45": {
"sha512": "PMWatW2NrT1uTXD7etJ4VdQ0wWZLFrIfdRGppD2QX7nzZ0+kIzqhq551u6ZiXJHWJgG4hWFEkSnUnt2aB6posg==",
"type": "package",
"path": "protobuf-net.core/3.2.45",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net462/protobuf-net.Core.dll",
"lib/net462/protobuf-net.Core.xml",
"lib/net6.0/protobuf-net.Core.dll",
"lib/net6.0/protobuf-net.Core.xml",
"lib/netstandard2.0/protobuf-net.Core.dll",
"lib/netstandard2.0/protobuf-net.Core.xml",
"lib/netstandard2.1/protobuf-net.Core.dll",
"lib/netstandard2.1/protobuf-net.Core.xml",
"protobuf-net.core.3.2.45.nupkg.sha512",
"protobuf-net.core.nuspec",
"protobuf-net.png",
"readme.md"
]
},
"SharpCompress/0.30.1": {
"sha512": "XqD4TpfyYGa7QTPzaGlMVbcecKnXy4YmYLDWrU+JIj7IuRNl7DH2END+Ll7ekWIY8o3dAMWLFDE1xdhfIWD1nw==",
"type": "package",
"path": "sharpcompress/0.30.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net461/SharpCompress.dll",
"lib/net5.0/SharpCompress.dll",
"lib/netcoreapp3.1/SharpCompress.dll",
"lib/netstandard2.0/SharpCompress.dll",
"lib/netstandard2.1/SharpCompress.dll",
"sharpcompress.0.30.1.nupkg.sha512",
"sharpcompress.nuspec"
]
},
"Snappier/1.0.0": {
"sha512": "rFtK2KEI9hIe8gtx3a0YDXdHOpedIf9wYCEYtBEmtlyiWVX3XlCNV03JrmmAi/Cdfn7dxK+k0sjjcLv4fpHnqA==",
"type": "package",
"path": "snappier/1.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"COPYING.txt",
"lib/net5.0/Snappier.dll",
"lib/net5.0/Snappier.xml",
"lib/netcoreapp3.0/Snappier.dll",
"lib/netcoreapp3.0/Snappier.xml",
"lib/netstandard2.0/Snappier.dll",
"lib/netstandard2.0/Snappier.xml",
"lib/netstandard2.1/Snappier.dll",
"lib/netstandard2.1/Snappier.xml",
"snappier.1.0.0.nupkg.sha512",
"snappier.nuspec"
]
},
"System.Buffers/4.5.1": {
"sha512": "Rw7ijyl1qqRS0YQD/WycNst8hUUMgrMH4FCn1nNm27M4VxchZ1js3fVjQaANHO5f3sN4isvP4a+Met9Y4YomAg==",
"type": "package",
"path": "system.buffers/4.5.1",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net461/System.Buffers.dll",
"lib/net461/System.Buffers.xml",
"lib/netcoreapp2.0/_._",
"lib/netstandard1.1/System.Buffers.dll",
"lib/netstandard1.1/System.Buffers.xml",
"lib/netstandard2.0/System.Buffers.dll",
"lib/netstandard2.0/System.Buffers.xml",
"lib/uap10.0.16299/_._",
"ref/net45/System.Buffers.dll",
"ref/net45/System.Buffers.xml",
"ref/netcoreapp2.0/_._",
"ref/netstandard1.1/System.Buffers.dll",
"ref/netstandard1.1/System.Buffers.xml",
"ref/netstandard2.0/System.Buffers.dll",
"ref/netstandard2.0/System.Buffers.xml",
"ref/uap10.0.16299/_._",
"system.buffers.4.5.1.nupkg.sha512",
"system.buffers.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Collections.Immutable/7.0.0": {
"sha512": "dQPcs0U1IKnBdRDBkrCTi1FoajSTBzLcVTpjO4MBCMC7f4pDOIPzgBoX8JjG7X6uZRJ8EBxsi8+DR1JuwjnzOQ==",
"type": "package",
"path": "system.collections.immutable/7.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"README.md",
"THIRD-PARTY-NOTICES.TXT",
"buildTransitive/net461/System.Collections.Immutable.targets",
"buildTransitive/net462/_._",
"buildTransitive/net6.0/_._",
"buildTransitive/netcoreapp2.0/System.Collections.Immutable.targets",
"lib/net462/System.Collections.Immutable.dll",
"lib/net462/System.Collections.Immutable.xml",
"lib/net6.0/System.Collections.Immutable.dll",
"lib/net6.0/System.Collections.Immutable.xml",
"lib/net7.0/System.Collections.Immutable.dll",
"lib/net7.0/System.Collections.Immutable.xml",
"lib/netstandard2.0/System.Collections.Immutable.dll",
"lib/netstandard2.0/System.Collections.Immutable.xml",
"system.collections.immutable.7.0.0.nupkg.sha512",
"system.collections.immutable.nuspec",
"useSharedDesignerContext.txt"
]
},
"System.IO.Pipelines/9.0.0": {
"sha512": "eA3cinogwaNB4jdjQHOP3Z3EuyiDII7MT35jgtnsA4vkn0LUrrSHsU0nzHTzFzmaFYeKV7MYyMxOocFzsBHpTw==",
"type": "package",
"path": "system.io.pipelines/9.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"PACKAGE.md",
"THIRD-PARTY-NOTICES.TXT",
"buildTransitive/net461/System.IO.Pipelines.targets",
"buildTransitive/net462/_._",
"buildTransitive/net8.0/_._",
"buildTransitive/netcoreapp2.0/System.IO.Pipelines.targets",
"lib/net462/System.IO.Pipelines.dll",
"lib/net462/System.IO.Pipelines.xml",
"lib/net8.0/System.IO.Pipelines.dll",
"lib/net8.0/System.IO.Pipelines.xml",
"lib/net9.0/System.IO.Pipelines.dll",
"lib/net9.0/System.IO.Pipelines.xml",
"lib/netstandard2.0/System.IO.Pipelines.dll",
"lib/netstandard2.0/System.IO.Pipelines.xml",
"system.io.pipelines.9.0.0.nupkg.sha512",
"system.io.pipelines.nuspec",
"useSharedDesignerContext.txt"
]
},
"System.Memory/4.5.5": {
"sha512": "XIWiDvKPXaTveaB7HVganDlOCRoj03l+jrwNvcge/t8vhGYKvqV+dMv6G4SAX2NoNmN0wZfVPTAlFwZcZvVOUw==",
"type": "package",
"path": "system.memory/4.5.5",
"files": [
".nupkg.metadata",
".signature.p7s",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net461/System.Memory.dll",
"lib/net461/System.Memory.xml",
"lib/netcoreapp2.1/_._",
"lib/netstandard1.1/System.Memory.dll",
"lib/netstandard1.1/System.Memory.xml",
"lib/netstandard2.0/System.Memory.dll",
"lib/netstandard2.0/System.Memory.xml",
"ref/netcoreapp2.1/_._",
"system.memory.4.5.5.nupkg.sha512",
"system.memory.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Runtime.CompilerServices.Unsafe/5.0.0": {
"sha512": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA==",
"type": "package",
"path": "system.runtime.compilerservices.unsafe/5.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net45/System.Runtime.CompilerServices.Unsafe.dll",
"lib/net45/System.Runtime.CompilerServices.Unsafe.xml",
"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll",
"lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.xml",
"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll",
"lib/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml",
"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll",
"lib/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml",
"ref/net461/System.Runtime.CompilerServices.Unsafe.dll",
"ref/net461/System.Runtime.CompilerServices.Unsafe.xml",
"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.dll",
"ref/netstandard1.0/System.Runtime.CompilerServices.Unsafe.xml",
"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.dll",
"ref/netstandard2.0/System.Runtime.CompilerServices.Unsafe.xml",
"ref/netstandard2.1/System.Runtime.CompilerServices.Unsafe.dll",
"ref/netstandard2.1/System.Runtime.CompilerServices.Unsafe.xml",
"system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512",
"system.runtime.compilerservices.unsafe.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Security.AccessControl/5.0.0": {
"sha512": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
"type": "package",
"path": "system.security.accesscontrol/5.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net46/System.Security.AccessControl.dll",
"lib/net461/System.Security.AccessControl.dll",
"lib/net461/System.Security.AccessControl.xml",
"lib/netstandard1.3/System.Security.AccessControl.dll",
"lib/netstandard2.0/System.Security.AccessControl.dll",
"lib/netstandard2.0/System.Security.AccessControl.xml",
"lib/uap10.0.16299/_._",
"ref/net46/System.Security.AccessControl.dll",
"ref/net461/System.Security.AccessControl.dll",
"ref/net461/System.Security.AccessControl.xml",
"ref/netstandard1.3/System.Security.AccessControl.dll",
"ref/netstandard1.3/System.Security.AccessControl.xml",
"ref/netstandard1.3/de/System.Security.AccessControl.xml",
"ref/netstandard1.3/es/System.Security.AccessControl.xml",
"ref/netstandard1.3/fr/System.Security.AccessControl.xml",
"ref/netstandard1.3/it/System.Security.AccessControl.xml",
"ref/netstandard1.3/ja/System.Security.AccessControl.xml",
"ref/netstandard1.3/ko/System.Security.AccessControl.xml",
"ref/netstandard1.3/ru/System.Security.AccessControl.xml",
"ref/netstandard1.3/zh-hans/System.Security.AccessControl.xml",
"ref/netstandard1.3/zh-hant/System.Security.AccessControl.xml",
"ref/netstandard2.0/System.Security.AccessControl.dll",
"ref/netstandard2.0/System.Security.AccessControl.xml",
"ref/uap10.0.16299/_._",
"runtimes/win/lib/net46/System.Security.AccessControl.dll",
"runtimes/win/lib/net461/System.Security.AccessControl.dll",
"runtimes/win/lib/net461/System.Security.AccessControl.xml",
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.dll",
"runtimes/win/lib/netcoreapp2.0/System.Security.AccessControl.xml",
"runtimes/win/lib/netstandard1.3/System.Security.AccessControl.dll",
"runtimes/win/lib/uap10.0.16299/_._",
"system.security.accesscontrol.5.0.0.nupkg.sha512",
"system.security.accesscontrol.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"System.Security.Principal.Windows/5.0.0": {
"sha512": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA==",
"type": "package",
"path": "system.security.principal.windows/5.0.0",
"files": [
".nupkg.metadata",
".signature.p7s",
"Icon.png",
"LICENSE.TXT",
"THIRD-PARTY-NOTICES.TXT",
"lib/net46/System.Security.Principal.Windows.dll",
"lib/net461/System.Security.Principal.Windows.dll",
"lib/net461/System.Security.Principal.Windows.xml",
"lib/netstandard1.3/System.Security.Principal.Windows.dll",
"lib/netstandard2.0/System.Security.Principal.Windows.dll",
"lib/netstandard2.0/System.Security.Principal.Windows.xml",
"lib/uap10.0.16299/_._",
"ref/net46/System.Security.Principal.Windows.dll",
"ref/net461/System.Security.Principal.Windows.dll",
"ref/net461/System.Security.Principal.Windows.xml",
"ref/netcoreapp3.0/System.Security.Principal.Windows.dll",
"ref/netcoreapp3.0/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/System.Security.Principal.Windows.dll",
"ref/netstandard1.3/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/de/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/es/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/fr/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/it/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/ja/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/ko/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/ru/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/zh-hans/System.Security.Principal.Windows.xml",
"ref/netstandard1.3/zh-hant/System.Security.Principal.Windows.xml",
"ref/netstandard2.0/System.Security.Principal.Windows.dll",
"ref/netstandard2.0/System.Security.Principal.Windows.xml",
"ref/uap10.0.16299/_._",
"runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.dll",
"runtimes/unix/lib/netcoreapp2.0/System.Security.Principal.Windows.xml",
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.dll",
"runtimes/unix/lib/netcoreapp2.1/System.Security.Principal.Windows.xml",
"runtimes/win/lib/net46/System.Security.Principal.Windows.dll",
"runtimes/win/lib/net461/System.Security.Principal.Windows.dll",
"runtimes/win/lib/net461/System.Security.Principal.Windows.xml",
"runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.dll",
"runtimes/win/lib/netcoreapp2.0/System.Security.Principal.Windows.xml",
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.dll",
"runtimes/win/lib/netcoreapp2.1/System.Security.Principal.Windows.xml",
"runtimes/win/lib/netstandard1.3/System.Security.Principal.Windows.dll",
"runtimes/win/lib/uap10.0.16299/_._",
"system.security.principal.windows.5.0.0.nupkg.sha512",
"system.security.principal.windows.nuspec",
"useSharedDesignerContext.txt",
"version.txt"
]
},
"ZstdSharp.Port/0.7.3": {
"sha512": "U9Ix4l4cl58Kzz1rJzj5hoVTjmbx1qGMwzAcbv1j/d3NzrFaESIurQyg+ow4mivCgkE3S413y+U9k4WdnEIkRA==",
"type": "package",
"path": "zstdsharp.port/0.7.3",
"files": [
".nupkg.metadata",
".signature.p7s",
"lib/net461/ZstdSharp.dll",
"lib/net5.0/ZstdSharp.dll",
"lib/net6.0/ZstdSharp.dll",
"lib/net7.0/ZstdSharp.dll",
"lib/netcoreapp3.1/ZstdSharp.dll",
"lib/netstandard2.0/ZstdSharp.dll",
"lib/netstandard2.1/ZstdSharp.dll",
"zstdsharp.port.0.7.3.nupkg.sha512",
"zstdsharp.port.nuspec"
]
}
},
"projectFileDependencyGroups": {
"net8.0": [
"Fantasy-Net >= 2024.2.22"
]
},
"packageFolders": {
"/Users/fantasy/.nuget/packages/": {}
},
"project": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj",
"projectName": "Entity",
"projectPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj",
"packagesPath": "/Users/fantasy/.nuget/packages/",
"outputPath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/",
"projectStyle": "PackageReference",
"configFilePaths": [
"/Users/fantasy/.nuget/NuGet/NuGet.Config"
],
"originalTargetFrameworks": [
"net8.0"
],
"sources": {
"/usr/local/share/dotnet/library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"projectReferences": {}
}
},
"warningProperties": {
"warnAsError": [
"NU1605"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "all"
},
"SdkAnalysisLevel": "9.0.100"
},
"frameworks": {
"net8.0": {
"targetAlias": "net8.0",
"dependencies": {
"Fantasy-Net": {
"target": "Package",
"version": "[2024.2.22, )"
}
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"frameworkReferences": {
"Microsoft.NETCore.App": {
"privateAssets": "all"
}
},
"runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/9.0.100/PortableRuntimeIdentifierGraph.json"
}
}
}
}

View File

@@ -0,0 +1,30 @@
{
"version": 2,
"dgSpecHash": "KLcJ+imhZmA=",
"success": true,
"projectFilePath": "/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj",
"expectedPackageFiles": [
"/Users/fantasy/.nuget/packages/commandlineparser/2.9.1/commandlineparser.2.9.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/dnsclient/1.6.1/dnsclient.1.6.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/fantasy-net/2024.2.22/fantasy-net.2024.2.22.nupkg.sha512",
"/Users/fantasy/.nuget/packages/microsoft.extensions.logging.abstractions/2.0.0/microsoft.extensions.logging.abstractions.2.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/microsoft.netcore.platforms/5.0.0/microsoft.netcore.platforms.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/microsoft.win32.registry/5.0.0/microsoft.win32.registry.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/mongodb.bson/3.1.0/mongodb.bson.3.1.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/mongodb.driver/3.1.0/mongodb.driver.3.1.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/newtonsoft.json/13.0.3/newtonsoft.json.13.0.3.nupkg.sha512",
"/Users/fantasy/.nuget/packages/protobuf-net/3.2.45/protobuf-net.3.2.45.nupkg.sha512",
"/Users/fantasy/.nuget/packages/protobuf-net.core/3.2.45/protobuf-net.core.3.2.45.nupkg.sha512",
"/Users/fantasy/.nuget/packages/sharpcompress/0.30.1/sharpcompress.0.30.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/snappier/1.0.0/snappier.1.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.buffers/4.5.1/system.buffers.4.5.1.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.collections.immutable/7.0.0/system.collections.immutable.7.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.io.pipelines/9.0.0/system.io.pipelines.9.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.memory/4.5.5/system.memory.4.5.5.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.runtime.compilerservices.unsafe/5.0.0/system.runtime.compilerservices.unsafe.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.security.accesscontrol/5.0.0/system.security.accesscontrol.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/system.security.principal.windows/5.0.0/system.security.principal.windows.5.0.0.nupkg.sha512",
"/Users/fantasy/.nuget/packages/zstdsharp.port/0.7.3/zstdsharp.port.0.7.3.nupkg.sha512"
],
"logs": []
}

View File

@@ -0,0 +1 @@
"restore":{"projectUniqueName":"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj","projectName":"Entity","projectPath":"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/Entity.csproj","outputPath":"/Users/fantasy/Movies/邮件系统/Lession/Server/Entity/obj/","projectStyle":"PackageReference","originalTargetFrameworks":["net8.0"],"sources":{"/usr/local/share/dotnet/library-packs":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net8.0":{"targetAlias":"net8.0","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]},"restoreAuditProperties":{"enableAudit":"true","auditLevel":"low","auditMode":"all"},"SdkAnalysisLevel":"9.0.100"}"frameworks":{"net8.0":{"targetAlias":"net8.0","dependencies":{"Fantasy-Net":{"target":"Package","version":"[2024.2.22, )"}},"imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"}},"runtimeIdentifierGraphPath":"/usr/local/share/dotnet/sdk/9.0.100/PortableRuntimeIdentifierGraph.json"}}

View File

@@ -0,0 +1 @@
17392438089776433

View File

@@ -0,0 +1 @@
17392438089776433

Binary file not shown.

View File

@@ -0,0 +1,36 @@
using Fantasy.Async;
using Fantasy.Entitas.Interface;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
#pragma warning disable CS8625 // Cannot convert null literal to non-nullable reference type.
namespace Fantasy;
public sealed class GateAccountFlagComponentSystem : DestroySystem<GateAccountFlagComponent>
{
protected override void Destroy(GateAccountFlagComponent self)
{
// DestroyAsync(self).Coroutine();
var selfAccount = self.Account;
if (selfAccount == null)
{
return;
}
var selfAccountMailRouteId = selfAccount.MailRouteId;
GateLoginHelper.Offline(self.Scene, selfAccountMailRouteId).Coroutine();
self.Account = null;
selfAccount.Dispose();
}
// private async FTask DestroyAsync(GateAccountFlagComponent self)
// {
// var selfAccount = self.Account;
// if (selfAccount == null)
// {
// return;
// }
// await GateLoginHelper.Offline(self.Scene,selfAccount.MailRouteId)
// self.Account = null;
// selfAccount.Dispose();
// }
}

View File

@@ -0,0 +1,23 @@
using Fantasy.Async;
using Fantasy.Network;
using Fantasy.Network.Interface;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
namespace Fantasy;
public sealed class C2G_ExitHandler : Message<C2G_Exit>
{
protected override async FTask Run(Session session, C2G_Exit message)
{
var gateAccountFlagComponent = session.GetComponent<GateAccountFlagComponent>();
if (gateAccountFlagComponent == null)
{
Log.Warning($"有用户不是通过正常途径访问到这个接口IP:{session.RemoteEndPoint.ToString()}");
return;
}
Log.Debug($"用户名:{gateAccountFlagComponent.Account.Name} 退出游戏的协议。");
// 如果执行了这个session.Dispose就会断开这个连接这样的情况下客户端也会断开。
session.Dispose();
await FTask.CompletedTask;
}
}

View File

@@ -0,0 +1,57 @@
using Fantasy.Async;
using Fantasy.Entitas;
using Fantasy.Helper;
using Fantasy.Network;
using Fantasy.Network.Interface;
#pragma warning disable CS8600 // Converting null literal or possible null value to non-nullable type.
namespace Fantasy;
public sealed class C2G_LoginRequestHandler : MessageRPC<C2G_LoginRequest, G2C_LoginResponse>
{
protected override async FTask Run(Session session, C2G_LoginRequest request, G2C_LoginResponse response, Action reply)
{
var scene = session.Scene;
if (string.IsNullOrEmpty(request.Name))
{
// 返回的1代表的用户名为空。
response.ErrorCode = 1;
return;
}
Log.Debug($"登陆的用户名为:{request.Name}");
// 检查用户是否存在
Account account = null;
var worldDataBase = scene.World.DataBase;
// 用协程锁来处理,异步逻辑的原子问题。
using (await scene.CoroutineLockComponent.Wait(CoroutineLockConst.LoginKey, request.Name.GetHashCode()))
{
account = await worldDataBase.First<Account>(d => d.Name == request.Name, true);
// 如果用户不存在,则创建一个用户。并且保存到数据库中.
if (account == null)
{
account = Entity.Create<Account>(scene, true, true);
account.Name = request.Name;
account.CreateTime = TimeHelper.Now;
await worldDataBase.Save(account);
Log.Debug($"当前账号:{request.Name} 不存在,所以创建了一个新的账号。");
}
else
{
Log.Debug($"当前账号:{request.Name} 已经存在,直接登陆。");
}
}
// 跟Session关联上Account下次发送消息直接可以通过GateAccountFlagComponent来获取Account。
session.AddComponent<GateAccountFlagComponent>().Account = account;
// 登陆到其他服务器。
var result = await GateLoginHelper.Online(session, account);
if (result != 0)
{
response.ErrorCode = result;
Log.Error($"登陆到其他服务器失败ErrorCode:{result}");
return;
}
Log.Debug($"登陆成功 Name:{account.Name}");
// 用这个方法来暂时消除async的黄色波浪线。这个只是为了消除黄色的波浪线如果有await这个就可以不用。
// await FTask.CompletedTask;
}
}

View File

@@ -0,0 +1,69 @@
using Fantasy.Async;
using Fantasy.Network;
using Fantasy.Platform.Net;
namespace Fantasy;
public static class GateLoginHelper
{
/// <summary>
/// Gate服务器登陆到其他服务器接口
/// </summary>
/// <param name="session"></param>
/// <param name="account"></param>
/// <returns></returns>
public static async FTask<uint> Online(Session session, Account account)
{
// 这里应该编写登陆到其他服务器的逻辑,现在没有暂时空着.
// 1、如何得到Mail服务器的地址。✅
// 2、如何做到发送到Gate服务器自动中间消息给Mail。
// 3、就算是Gate可以中间Mail消息到Mail服务器了那Mail如何发送消息给Gate再让Gate自动的发送消息给客户端呢。
var scene = session.Scene;
var mailConfig = SceneConfigData.Instance.GetSceneBySceneType(SceneType.Mail)[0];
// 挂载自定义路由协议组件挂载了这个组件后就可以自动转发Route协议了。
var routeComponent = session.GetOrAddComponent<RouteComponent>();
// var mailAddress = "127.0.0.1" + mailConfig.InnerPort;
//mailConfig.RouteId 423423445678974
// 发送服务器之间的消息需要通过当前Scene的NetworkMessagingComponent组件来进行发送。
var response = (Mail2G_LoginResponse)await scene.NetworkMessagingComponent.CallInnerRoute(mailConfig.RouteId, new G2Mail_LoginRequest()
{
AccountId = account.Id,
Name = account.Name,
CreateTime = account.CreateTime,
GateRouteId = session.RuntimeId
});
if (response.ErrorCode != 0)
{
return response.ErrorCode;
}
// 保存这个MailUnitRouteId用于后续的下线等操作。
account.MailRouteId = response.MailUnitRouteId;
// 添加自定义路由协议地址。
routeComponent.AddAddress(RouteType.MailRoute, response.MailUnitRouteId);
// // Gate服务器发送一个消息给Mail服务器
// scene.NetworkMessagingComponent.SendInnerRoute(response.MailUnitRouteId,new G2Mail_TestMessage()
// {
// Tag = "666"
// });
return 0;
}
/// <summary>
/// Gate服务器下线其他服务器接口
/// </summary>
/// <param name="scene"></param>
/// <param name="mailRouteId"></param>
/// <returns></returns>
public static async FTask<uint> Offline(Scene scene, long mailRouteId)
{
// 给Mail服务器发送下线消息
var mailResponse = (Mail2G_ExitResponse)await scene.NetworkMessagingComponent.CallInnerRoute(mailRouteId, new G2Mail_ExitRequest());
if (mailResponse.ErrorCode != 0)
{
Log.Error($"Mail服务器无法正常下线 ErrorCode:{mailResponse.ErrorCode}");
return mailResponse.ErrorCode;
}
return 0;
}
}

View File

@@ -0,0 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Entity\Entity.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,225 @@
using Fantasy.Async;
using Fantasy.DataStructure.Collection;
using Fantasy.Entitas.Interface;
using Fantasy.Helper;
namespace Fantasy;
public class MailBoxManageComponentDestroySystem : DestroySystem<MailBoxManageComponent>
{
protected override void Destroy(MailBoxManageComponent self)
{
if (self.TimerId != 0)
{
self.Scene.TimerComponent.Net.Remove(ref self.TimerId);
}
foreach (var (_, mailBox) in self.MailBoxes)
{
mailBox.Dispose();
}
self.MinTime = 0;
self.MailsByAccount.Clear();
self.MailsByMailBoxType.Clear();
self.Timers.Clear();
self.TimeOutQueue.Clear();
}
}
public static class MailBoxManageComponentSystem
{
public static async FTask Init(this MailBoxManageComponent self)
{
// 获取数据库中所有的没有处理完成的MailBox
var mailBoxes = await self.Scene.World.DataBase.Query<MailBox>(d => true);
foreach (var mailBox in mailBoxes)
{
self.MailBoxes.Add(mailBox.Id, mailBox);
switch (mailBox.MailBoxType)
{
case MailBoxType.Specify:
{
foreach (var accountId in mailBox.AccountId)
{
self.MailsByAccount.Add(accountId, mailBox);
}
break;
}
case MailBoxType.All:
case MailBoxType.AllToDate:
{
self.MailsByMailBoxType.Add((int)mailBox.MailBoxType, mailBox);
break;
}
}
}
self.TimerId = self.Scene.TimerComponent.Net.RepeatedTimer(MailBoxManageComponent.MailCheckTIme, self.Timeout);
}
private static void Timeout(this MailBoxManageComponent self)
{
var currentTime = TimeHelper.Now;
if (currentTime < self.MinTime)
{
return;
}
// 检查当然时候有过期的邮件箱需要处理
foreach (var (timeKey, _) in self.Timers)
{
if (timeKey > currentTime)
{
self.MinTime = timeKey;
break;
}
self.TimeOutQueue.Enqueue(timeKey);
}
while (self.TimeOutQueue.TryDequeue(out var timeKey))
{
foreach (var mailBoxId in self.Timers[timeKey])
{
Log.Info($"MailBox:{mailBoxId} 过期了!");
self.Remove(mailBoxId).Coroutine();
}
self.Timers.RemoveKey(timeKey);
}
}
public static async FTask Remove(this MailBoxManageComponent self, long mailBoxId)
{
if (!self.MailBoxes.Remove(mailBoxId, out var mailBox))
{
return;
}
// 先删除按照分类存储的邮箱
self.MailsByMailBoxType.RemoveValue((int)mailBox.MailBoxType, mailBox);
// 删除个人邮件的邮件箱
self.MailsByAccount.RemoveValue(mailBoxId, mailBox);
// 在数据库中删除这个邮件
await self.Scene.World.DataBase.Remove<MailBox>(mailBoxId);
// 销毁这个MailBox
mailBox.Dispose();
}
public static async FTask GetHaveMail(this MailBoxManageComponent self, MailUnit mailUnit, bool sync)
{
var now = TimeHelper.Now;
var worldDataBase = self.Scene.World.DataBase;
var mailComponent = mailUnit.GetComponent<MailComponent>();
// 玩家领取范围邮件的逻辑处理
foreach (var (mailBoxType, mailBoxList) in self.MailsByMailBoxType)
{
using var removeMailBox = ListPool<MailBox>.Create();
switch ((MailBoxType)mailBoxType)
{
// 发送给所有人的邮件
case MailBoxType.All:
{
foreach (var mailBox in mailBoxList)
{
if (!mailBox.Received.Contains(mailUnit.Id))
{
// 如果是没有领取过这个邮件,首先要把自己添加到领取过的名单中。
mailBox.Received.Add(mailUnit.Id);
// 发送给自己的邮件列表里添加邮件。
await mailUnit.GetComponent<MailComponent>().Add(MailFactory.Serializer.Clone(mailBox.Mail), true);
}
if (mailBox.ExpireTime <= now)
{
// 邮件已经过期了,要进行清理这个邮件的操作了
removeMailBox.Add(mailBox);
continue;
}
// 保存邮件箱状态到数据库中。
await worldDataBase.Save(mailBox);
}
foreach (var mailBox in removeMailBox)
{
await self.Remove(mailBox.Id);
}
// 这里有一个小的细节要处理,这里大家课下自己实现一下。
break;
}
case MailBoxType.AllToDate:
{
foreach (var mailBox in mailBoxList)
{
Log.Debug($"mailBox.CreateTime >= mailUnit.CreateTime {mailBox.CreateTime} >= {mailUnit.CreateTime}");
if (mailBox.CreateTime >= mailUnit.CreateTime && !mailBox.Received.Contains(mailUnit.Id))
{
// 如果是没有领取过这个邮件,首先要把自己添加到领取过的名单中。
mailBox.Received.Add(mailUnit.Id);
// 发送给自己的邮件列表里添加邮件。
await mailUnit.GetComponent<MailComponent>().Add(MailFactory.Serializer.Clone(mailBox.Mail), true);
}
if (mailBox.ExpireTime <= now)
{
// 邮件已经过期了,要进行清理这个邮件的操作了
removeMailBox.Add(mailBox);
continue;
}
// 保存邮件箱状态到数据库中。
await worldDataBase.Save(mailBox);
}
foreach (var mailBox in removeMailBox)
{
await self.Remove(mailBox.Id);
}
break;
}
}
}
if (self.MailsByAccount.TryGetValue(mailUnit.AccountId, out var mailBoxes))
{
using var removeMailBox = ListPool<MailBox>.Create();
foreach (var mailBox in mailBoxes)
{
var cloneMail = MailFactory.Serializer.Clone(mailBox.Mail);
await mailComponent.Add(cloneMail, sync);
mailBox.AccountId.Remove(mailUnit.AccountId);
Log.Debug($"领取了一个离线邮件 MailId:{cloneMail.Id}");
if (mailBox.AccountId.Count <= 0)
{
// 当邮件箱里没有要发送的玩家了,就表示这个邮件箱已经没有用处,可以删除了。
removeMailBox.Add(mailBox);
}
}
foreach (var mailBox in removeMailBox)
{
await self.Remove(mailBox.Id);
}
if (mailBoxes.Count <= 0)
{
// 如果MailsByAccount里的邮件箱已经没有邮件了就删除这个邮件箱的缓存。
self.MailsByAccount.RemoveByKey(mailUnit.AccountId);
}
}
}
}

View File

@@ -0,0 +1,226 @@
using Fantasy.Async;
using Fantasy.DataStructure.Collection;
using Fantasy.Entitas.Interface;
using Fantasy.Helper;
#pragma warning disable CS8619 // Nullability of reference types in value doesn't match target type.
namespace Fantasy;
public class MailComponentDestroySystem : DestroySystem<MailComponent>
{
protected override void Destroy(MailComponent self)
{
foreach (var (_, mail) in self.Mails)
{
mail.Dispose();
}
self.Mails.Clear();
self.Timer.Clear();
}
}
public class MailComponentDeserializeSystem : DeserializeSystem<MailComponent>
{
protected override void Deserialize(MailComponent self)
{
self.Timer.Clear();
foreach (var (_, mail) in self.Mails)
{
self.Timer.Add(mail.ExpireTime, mail.Id);
}
}
}
public static class MailComponentSystem
{
public static async FTask Add(this MailComponent self, Mail mail, bool sync)
{
mail.CreateTime = TimeHelper.Now;
mail.ExpireTime = mail.CreateTime + MailComponent.MailExpireTime;
// 如果身上的邮件数量,大于了设置的最大数量怎么办?
// 先不用考虑,稍后咱们再解决问题。
if (self.Mails.Count >= MailComponent.MaxMailCount)
{
// 删除最老的邮件。
var (_, value) = self.Timer.First();
var removeId = value[0];
await self.Remove(removeId, MailRemoveActionType.Overtop, sync);
}
self.Mails.Add(mail.Id, mail);
self.Timer.Add(mail.ExpireTime, mail.Id);
if (sync)
{
// 同步邮件状态给客户端。
self.Scene.NetworkMessagingComponent.SendInnerRoute(self.GetParent<MailUnit>().GateRouteId, new Mail2C_HaveMail()
{
Mail = mail.ToMailSimplifyInfo()
});
}
// 这里的保存,也可以不用,这里看情况而定。
await self.Scene.World.DataBase.Save(self);
Log.Info($"MailComponentSystem Add {mail.Id} Count:{self.Mails.Count}");
}
public static async FTask<uint> Remove(this MailComponent self, long mailId, MailRemoveActionType mailRemoveActionType ,bool sync)
{
if (!self.Mails.Remove(mailId, out var mail))
{
// 这里的1代表的没有找到对应邮件。
return 1;
}
self.Timer.RemoveValue(mail.ExpireTime, mail.Id);
mail.Dispose();
if (sync)
{
// 同步给客户端,邮件删除的消息。
self.Scene.NetworkMessagingComponent.SendInnerRoute(self.GetParent<MailUnit>().GateRouteId,
new Mail2C_MailState()
{
MailState = (int)mailRemoveActionType, MailId = mailId
});
}
// 保存下数据库。
await self.Scene.World.DataBase.Save(self);
Log.Info($"MailComponentSystem Remove {mailId} mailRemoveActionType:{mailRemoveActionType} Count:{self.Mails.Count}");
return 0;
}
public static async FTask CheckTimeOut(this MailComponent self)
{
var now = TimeHelper.Now;
using var listPool = ListPool<long>.Create();
foreach (var (_, mail) in self.Mails)
{
if (mail.ExpireTime > now)
{
continue;
}
listPool.Add(mail.Id);
}
foreach (var mailId in listPool)
{
await self.Remove(mailId, MailRemoveActionType.ExpireTimeRemove,false);
}
Log.Info($"MailComponentSystem CheckTimeOut Count:{listPool.Count}");
}
public static async FTask<(uint ErrorCode, Mail mail)> OpenMail(this MailComponent self, long mailId)
{
if (!self.Mails.TryGetValue(mailId, out var mail))
{
// 这个1代表的是没有找到对应邮件
return (1, null);
}
if (mail.ExpireTime < TimeHelper.Now)
{
// 如果邮件已经过期了,需要清楚这个邮件。
await self.Remove(mailId, MailRemoveActionType.ExpireTimeRemove, true);
// 这里2代表的是邮件已经过期。
return (2, null);
}
mail.MailState = MailState.HaveRead;
// 这个保存数据库不是必须要保存的,因为一个邮件的查看状态并不能影响游戏的逻辑。
// 这里的话,大家看自己的需求而定。
await self.Scene.World.DataBase.Save(self);
return (0, mail);
}
public static void GetMailSimplifyInfos(this MailComponent self, ICollection<MailSimplifyInfo> mailSimplifyInfos)
{
foreach (var (_, mail) in self.Mails)
{
mailSimplifyInfos.Add(mail.ToMailSimplifyInfo());
}
}
public static void GetMailSimplifyInfos(this MailComponent self, ICollection<MailSimplifyInfo> mailSimplifyInfos, int pageIndex, int pageSize)
{
foreach (var (_, mail) in self.Mails.Skip((pageIndex -1) * pageSize).Take(pageSize))
{
mailSimplifyInfos.Add(mail.ToMailSimplifyInfo());
}
}
public static async FTask<uint> Receive(this MailComponent self, long mailId, bool money, List<long> item, bool sync)
{
if (!self.Mails.TryGetValue(mailId, out var mail))
{
// 这里的1代表是没有找到该邮件。
return 1;
}
var needSave = false;
if (money && mail.Money > 0)
{
// 领取金钱一般都是在玩家身上但现在咱们所在的服务器是Mail服务器玩家并不在这个服务器.
// 所以一般金钱的操作会有一个专用的接口来操作。这个接口无论在什么服务器上,都会正确的发送到用户所在的服务器上进行金钱操作。
// 假设下面的增加金钱的一个异步接口。
// var resposne = await MoneyHelper.Add(self.Scene, mail.Money, sync);
// if (resposne.ErrorCode != 0)
// {
// // 这里的2代表的是金钱添加失败。
// return 2;
// }
// 再假设增加金钱是成功的,那么咱们就要处理邮件相关信息了。
mail.Money = 0;
needSave = true;
}
if (item != null && item.Count > 0)
{
using var listItem = ListPool<Item>.Create();
foreach (var itemId in item)
{
var rItem = mail.Items.FirstOrDefault(d => d.Id == itemId);
if (rItem == null)
{
continue;
}
listItem.Add(rItem);
}
// 假设背包在其他服务器,需要调用某一个接口来添加物品到目标服务器的背包身上。
// var response = await BagHelper.Add(self.Scene, listItem, sync);
// if (response.ErrorCode != 0)
// {
// return 2;
// }
// 还有一种情况就是背包里的空间只有一个空余位置了也就是只能放进一个物品了但是邮件领取的是2个物品.
// 会有下面2中情况,当然这个情况是要策划来决定怎么处理:
// 1、只领取一个物品到背包中另外一个不领取然后提示用户背包已满。
// 2、一个都不领取直接提示用户背包已满。
// 如果是是第一种情况下把BagHelper.Add接口就需要返回添加成功的物品ID方便邮件来处理。
// 假设全部物品都领取成功了,就可以执行下面的逻辑了。
foreach (var item1 in listItem)
{
mail.Items.Remove(item1);
item1.Dispose();
}
needSave = true;
}
if (needSave)
{
await self.Scene.World.DataBase.Save(self);
}
return 0;
}
}

View File

@@ -0,0 +1,176 @@
using Fantasy.Async;
using Fantasy.Entitas;
using Fantasy.Entitas.Interface;
using Fantasy.Helper;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
#pragma warning disable CS8601 // Possible null reference assignment.
namespace Fantasy;
public sealed class MailUnitManageComponentDestroySystem : DestroySystem<MailUnitManageComponent>
{
protected override void Destroy(MailUnitManageComponent self)
{
// 如果不是在.net8的环境下比如是Unity里。这个的foreach有可能会出现问题
// 问题的原因是有可能你在mailUnit组件的销毁的时候去UnitByAccountId删除。
// 这样就会出现了一个经典的错误就是无法再foreach里删除或改变元素。
foreach (var (_, mailUnit) in self.UnitByAccountId)
{
mailUnit.Dispose();
}
self.UnitByAccountId.Clear();
self.UnitByName.Clear();
self.Online.Clear();
}
}
public static class MailUnitManageComponentSystem
{
public static async FTask Init(this MailUnitManageComponent self)
{
var units = await self.Scene.World.DataBase.Query<MailUnit>(d => true, true);
foreach (var mailUnit in units)
{
self.UnitByName.Add(mailUnit.Name, mailUnit);
self.UnitByAccountId.Add(mailUnit.AccountId,mailUnit);
}
Log.Debug($"MailUnitManageComponent Init units:{units.Count}");
}
/// <summary>
/// 用户中心登录逻辑,如果有更新的数据,会自动更新。
/// </summary>
/// <param name="self"></param>
/// <param name="accountId"></param>
/// <param name="unitName"></param>
/// <param name="gateRouteId"></param>
/// <returns></returns>
public static async FTask<MailUnit> Online(this MailUnitManageComponent self, long accountId, string unitName, long gateRouteId)
{
var selfScene = self.Scene;
if (self.UnitByAccountId.TryGetValue(accountId, out var mailUnit))
{
Log.Debug($"用户已经存在行不需要重新创建 Name:{unitName} mailUnit:{mailUnit.RuntimeId}");
if (mailUnit.Name != unitName)
{
// 如果不一致的情况,要先删除之前的缓存,然后再添加到缓存。
self.UnitByName.Remove(mailUnit.Name);
self.UnitByName.Add(unitName, mailUnit);
mailUnit.Name = unitName;
}
}
else
{
// 创建新的MailUnit实体。
mailUnit = Entity.Create<MailUnit>(selfScene,accountId, true, true);
mailUnit.Name = unitName;
mailUnit.AccountId = accountId;
mailUnit.CreateTime = TimeHelper.Now;
// 把创建好的实体添加到缓存中,方便后面使用。
self.UnitByAccountId.Add(accountId, mailUnit);
self.UnitByName.Add(unitName,mailUnit);
Log.Debug($"用户不存在行需要创建 Name:{unitName} mailUnit:{mailUnit.RuntimeId}");
}
// 设置GateRouteId
mailUnit.GateRouteId = gateRouteId;
// 设置MailComponent
if (mailUnit.GetComponent<MailComponent>() == null)
{
// 数据库中查询这个组件是否存在。
var mailComponent = await selfScene.World.DataBase.Query<MailComponent>(mailUnit.Id, true);
if (mailComponent == null)
{
// MailUnit没有这个MailComponent组件就给添加一个新的组件。
mailUnit.AddComponent<MailComponent>();
}
else
{
mailUnit.AddComponent(mailComponent);
}
}
// 可选,如果你不需要保存到数据库,那么可以忽略下面的代码。
await selfScene.World.DataBase.Save(mailUnit);
// 领取下离线的邮件。如果有的情况下。
await selfScene.GetComponent<MailBoxManageComponent>().GetHaveMail(mailUnit, true);
// 把用户添加到在线的列表
self.Online.Add(mailUnit.Id, mailUnit);
// 返回MailUnit实体。
return mailUnit;
}
/// <summary>
/// 退出登录逻辑,会自动保存数据。
/// </summary>
/// <param name="self"></param>
/// <param name="mailUnit"></param>
public static async FTask Exit(this MailUnitManageComponent self, MailUnit mailUnit)
{
var mailComponent = mailUnit.GetComponent<MailComponent>();
if (mailComponent == null)
{
return;
}
// 保存mailComponent到数据库中。
await self.Scene.World.DataBase.Save(mailComponent);
// 移除这个组件。
mailUnit.RemoveComponent<MailComponent>();
// 在在线列表的容器中移除这个MailUnit实体。
self.Online.Remove(mailUnit.Id);
Log.Debug($"AccountId:{mailUnit.AccountId} Name:{mailUnit.Name} Exit!");
}
/// <summary>
/// 根据UnitName获取MailUnit实体
/// </summary>
/// <param name="self"></param>
/// <param name="unitName"></param>
/// <param name="mailUnit"></param>
/// <returns></returns>
public static bool TryGet(this MailUnitManageComponent self, string unitName, out MailUnit mailUnit)
{
return self.UnitByName.TryGetValue(unitName, out mailUnit);
}
/// <summary>
/// 根据AccountId获取MailUnit实体
/// </summary>
/// <param name="self"></param>
/// <param name="accountId"></param>
/// <param name="mailUnit"></param>
/// <returns></returns>
public static bool TryGet(this MailUnitManageComponent self, long accountId, out MailUnit mailUnit)
{
return self.UnitByAccountId.TryGetValue(accountId, out mailUnit);
}
/// <summary>
/// 删除MailUnit实体。
/// </summary>
/// <param name="self"></param>
/// <param name="accountId"></param>
/// <returns></returns>
public static async FTask<uint> Remove(this MailUnitManageComponent self, long accountId)
{
// if (!self.UnitByAccountId.TryGetValue(accountId, out var mailUnit))
// {
// // 这个1代表的是没有找到对应的MailUnit
// return 1;
// }
if (!self.UnitByAccountId.Remove(accountId, out var mailUnit))
{
// 这个1代表的是没有找到对应的MailUnit
return 1;
}
self.UnitByName.Remove(mailUnit.Name);
// 在数据库中删除MailUnit实体
await self.Scene.World.DataBase.Remove<MailUnit>(mailUnit.Id);
// 销毁这个MailUnit
mailUnit.Dispose();
return 0;
}
}

View File

@@ -0,0 +1,22 @@
using Fantasy.Entitas.Interface;
namespace Fantasy;
public class MailBoxDestroySystem : DestroySystem<MailBox>
{
protected override void Destroy(MailBox self)
{
if (self.Mail != null)
{
self.Mail.Dispose();
self.Mail = null;
}
self.MailBoxType = MailBoxType.None;
self.CreateTime = 0;
self.ExpireTime = 0;
self.SendAccountId = 0;
self.AccountId.Clear();
self.Received.Clear();
}
}

View File

@@ -0,0 +1,69 @@
using Fantasy.Entitas.Interface;
namespace Fantasy;
public sealed class MailDestroySystem : DestroySystem<Mail>
{
protected override void Destroy(Mail self)
{
self.OwnerId = 0;
self.Title = null;
self.Content = null;
self.CreateTime = 0;
self.ExpireTime = 0;
self.Money = 0;
self.MailState = MailState.None;
self.MailType = MailType.None;
foreach (var selfItem in self.Items)
{
selfItem.Dispose();
}
self.Items.Clear();
}
}
public static class MailSystem
{
public static MailSimplifyInfo ToMailSimplifyInfo(this Mail self)
{
return new MailSimplifyInfo()
{
MailId = self.Id,
OwnerId = self.OwnerId,
Title = self.Title,
Content = self.Content,
CreateTime = self.CreateTime,
ExpireTime = self.ExpireTime,
MailState = (int)self.MailState,
MailType = (int)self.MailType
};
}
public static MailInfo ToMailInfo(this Mail self)
{
var mailInfo = new MailInfo()
{
MailId = self.Id,
OwnerId = self.OwnerId,
Title = self.Title,
Content = self.Content,
CreateTime = self.CreateTime,
ExpireTime = self.ExpireTime,
Money = self.Money,
MailState = (int)self.MailState,
MailType = (int)self.MailType
};
foreach (var selfItem in self.Items)
{
mailInfo.Items.Add(new ItemInfo()
{
Name = selfItem.Name,
});
}
return mailInfo;
}
}

View File

@@ -0,0 +1,14 @@
using Fantasy.Entitas.Interface;
namespace Fantasy;
public class MailUnitDestroySystem: DestroySystem<MailUnit>
{
protected override void Destroy(MailUnit self)
{
self.Name = null;
self.AccountId = 0;
self.CreateTime = 0;
self.GateRouteId = 0;
}
}

View File

@@ -0,0 +1,12 @@
using Fantasy.Async;
using Fantasy.Network.Interface;
namespace Fantasy;
public class Other2Mail_SendRequestHandler : RouteRPC<Scene, Other2Mail_SendMailRequest, Mail2Other_SendMailResponse>
{
protected override async FTask Run(Scene scene, Other2Mail_SendMailRequest request, Mail2Other_SendMailResponse response, Action reply)
{
await MailHelper.Send(scene, request.MailBox);
}
}

View File

@@ -0,0 +1,25 @@
using Fantasy.Async;
using Fantasy.Network.Interface;
// ReSharper disable ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract
namespace Fantasy;
public sealed class C2Mail_GetHaveMailRequestHandler : RouteRPC<MailUnit, C2Mail_GetHaveMailRequest, Mail2C_GetHaveMailResposne>
{
protected override async FTask Run(MailUnit mailUnit, C2Mail_GetHaveMailRequest request, Mail2C_GetHaveMailResposne response, Action reply)
{
var mailComponent = mailUnit.GetComponent<MailComponent>();
// 这个mailComponent是不是可能会为空?答案是可能的。
// 那如果是空的怎么办呢,这样情况只能是别人恶意发包了。
if (mailComponent == null)
{
return;
}
// 检查是否有超时的邮件。如果有那就清楚掉
await mailComponent.CheckTimeOut();
// 领取当前的邮件
mailComponent.GetMailSimplifyInfos(response.Mails);
}
}

View File

@@ -0,0 +1,32 @@
using Fantasy.Async;
using Fantasy.Network.Interface;
namespace Fantasy;
public class C2Mail_OpenMailRequestHandler : RouteRPC<MailUnit, C2Mail_OpenMailRequest, Mail2C_OpenMailResposne>
{
protected override async FTask Run(MailUnit mailUnit, C2Mail_OpenMailRequest request, Mail2C_OpenMailResposne response, Action reply)
{
if (request.MailId <= 0)
{
response.ErrorCode = 100;
return;
}
// 根据这个MailId来拿到邮件的详细信息
var (errorCode, mail) = await mailUnit.GetComponent<MailComponent>().OpenMail(request.MailId);
if (errorCode != 0)
{
response.ErrorCode = errorCode;
return;
}
if (!request.ReturnMailInfo)
{
return;
}
response.MailInfo = mail.ToMailInfo();
}
}

View File

@@ -0,0 +1,19 @@
using Fantasy.Async;
using Fantasy.Network.Interface;
namespace Fantasy;
public class C2Mail_ReceiveMailRequestHandler : RouteRPC<MailUnit, C2Mail_ReceiveMailRequest, Mail2C_ReceiveMailResponse>
{
protected override async FTask Run(MailUnit mailUnit, C2Mail_ReceiveMailRequest request, Mail2C_ReceiveMailResponse response, Action reply)
{
if (request.MailId <= 0)
{
response.ErrorCode = 100;
return;
}
response.ErrorCode = await mailUnit.GetComponent<MailComponent>()
.Receive(request.MailId, request.Money, request.ItemId, true);
}
}

View File

@@ -0,0 +1,21 @@
using Fantasy.Async;
using Fantasy.Network.Interface;
namespace Fantasy;
public class C2Mail_RemoveMailRequestHandler : RouteRPC<MailUnit,C2Mail_RemoveMailRequest, Mail2C_RemoveMailResponse>
{
protected override async FTask Run(MailUnit mailUnit, C2Mail_RemoveMailRequest request, Mail2C_RemoveMailResponse response, Action reply)
{
if (request.MailId <= 0)
{
// 这里的1代表MailId不正确。
response.ErrorCode = 1;
return;
}
response.ErrorCode = await mailUnit.GetComponent<MailComponent>()
.Remove(request.MailId, MailRemoveActionType.Remove, true);
}
}

View File

@@ -0,0 +1,67 @@
using Fantasy.Async;
using Fantasy.DataStructure.Collection;
using Fantasy.Network.Interface;
namespace Fantasy;
public class C2Mail_SendMailRequestHandler : RouteRPC<MailUnit, C2Mail_SendMailRequest, Mail2C_SendMailResponse>
{
protected override async FTask Run(MailUnit mailUnit, C2Mail_SendMailRequest request, Mail2C_SendMailResponse response, Action reply)
{
if (string.IsNullOrEmpty(request.UserName))
{
// 这里的1代表的是发送的接收玩家名字不正确。
response.ErrorCode = 1;
return;
}
if (string.IsNullOrEmpty(request.Title) || string.IsNullOrEmpty(request.Content))
{
// 这里的2代表的是发送的邮件标题或者内容不正确。
response.ErrorCode = 2;
return;
}
if (request.ItemId.Count > 10)
{
// 这里的3代表的是发送的邮件附件超出了最大范围。
response.ErrorCode = 3;
return;
}
if (!mailUnit.Scene.GetComponent<MailUnitManageComponent>().TryGet(request.UserName, out var receiveMailUnit))
{
// 这里的4代表的是没有该玩家。
response.ErrorCode = 4;
return;
}
if (request.Money > 0)
{
// 如果大于0就要调用某一个接口去货币所在的服务器上面去扣除玩家的钱。
// var moneyResposne = await MoneyHelper.Cost(mailUnit.Scene, request.Money);
// if (moneyResposne.ErrorCode != 0)
// {
// response.ErrorCode = moneyResposne.ErrorCode;
// return;
// }
}
using var mailItems = ListPool<Item>.Create();
if (request.ItemId.Count > 0)
{
// var itemResposne = await BagHelper.Get(mailUnit.Scene, request.ItemId);
// if (itemResposne.ErrorCode != 0)
// {
// response.ErrorCode = itemResposne.ErrorCode;
// return;
// }
// mailItems.AddRange(itemResposne.Items);
}
var accountId = ListPool<long>.Create(receiveMailUnit.AccountId);
var mail = MailFactory.Create(mailUnit.Scene, MailType.User, request.Title, request.Content, request.Money, mailItems);
var mailBox = MailBoxFactory.Create(mailUnit.Scene, MailBoxType.Specify, mailUnit.AccountId, mail, 1000 * 60 * 60, accountId);
await MailHelper.Send(mailUnit.Scene, mailBox);
}
}

View File

@@ -0,0 +1,19 @@
using Fantasy.Async;
using Fantasy.DataStructure.Collection;
using Fantasy.Network.Interface;
namespace Fantasy;
public class C2Mail_TestRequestHandler : RouteRPC<MailUnit, C2Mail_TestRequest, Mail2C_TestResponse>
{
protected override async FTask Run(MailUnit mailUnit, C2Mail_TestRequest request, Mail2C_TestResponse response, Action reply)
{
Log.Debug($"这是一个测试的自定义消息协议 Tag:{mailUnit.Name}");
response.Tag = "666";
// using var accountId = ListPool<long>.Create(65491190472245249);
var mail = MailFactory.Create(mailUnit.Scene, MailType.System, "测试所有人指定日期玩家邮件", "测试所有人指定日期玩家邮件内容", 9991);
var mailBox = MailBoxFactory.Create(mailUnit.Scene, MailBoxType.AllToDate, mailUnit.AccountId, mail,
1000 * 60 * 60);
await MailHelper.Send(mailUnit.Scene, mailBox);
}
}

View File

@@ -0,0 +1,12 @@
using Fantasy.Async;
using Fantasy.Network.Interface;
namespace Fantasy;
public class G2Mail_ExitRequestHandler : RouteRPC<MailUnit, G2Mail_ExitRequest, Mail2G_ExitResponse>
{
protected override async FTask Run(MailUnit mailUnit, G2Mail_ExitRequest request, Mail2G_ExitResponse response, Action reply)
{
await mailUnit.Scene.GetComponent<MailUnitManageComponent>().Exit(mailUnit);
}
}

Some files were not shown because too many files have changed in this diff Show More