using asg_form; using asg_form.Controllers; using asg_form.Controllers.Hubs; using Flandre.Adapters.OneBot.Extensions; using Flandre.Framework; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Options; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using Mirai.Net.Sessions; using Mirai.Net.Sessions.Http.Managers; using MrHuo.OAuth; using MrHuo.OAuth.Github; using MrHuo.OAuth.Microsoft; using Scalar.AspNetCore; using System; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Reflection; using System.Text; using Zack.EventBus; Console.WriteLine("\n _____ _________ ________ \n / _ \\ / _____// _____/ \n / /_\\ \\ \\_____ \\/ \\ ___ \n/ | \\/ \\ \\_\\ \\\n\\____|__ /_______ /\\______ /\n \\/ \\/ \\/ \n__________ __ ___________ .___\n\\______ \\_____ ____ | | __\\_ _____/ ____ __| _/\n | | _/\\__ \\ _/ ___\\| |/ / | __)_ / \\ / __ | \n | | \\ / __ \\\\ \\___| < | \\ | \\/ /_/ | \n |______ /(____ /\\___ >__|_ \\/_______ /___| /\\____ | \n \\/ \\/ \\/ \\/ \\/ \\/ \\/ "); var builder = WebApplication.CreateBuilder(args); //builder.AddServiceDefaults(); // Add services to the container. builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSignalR(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "ASG 赛事官网-后端API文档", Version = "V 1.9.7", Description = "这是由罗澜使用ASP.NET.Core开发的ASG赛事组后端系统,包括官网和后台管理系统。使用 sqlserver作为数据库,identity框架进行账号控制。", }); var file = Path.Combine(AppContext.BaseDirectory, "ASG后端.xml"); var path = Path.Combine(AppContext.BaseDirectory, file); c.IncludeXmlComments(path, true); c.OrderActionsBy(o => o.RelativePath); var scheme = new OpenApiSecurityScheme() { Description = "Authorization header. \r\nExample: 'Bearer 12345abcdef'", Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Authorization" }, Scheme = "oauth2", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, }; c.AddSecurityDefinition("Authorization", scheme); var requirement = new OpenApiSecurityRequirement(); requirement[scheme] = new List(); c.AddSecurityRequirement(requirement); }); string[] urls = new[] { "https://idvasg.cn", "https://nocdn.idvasg.cn", "http://localhost:8080", "https://commentary.idvasg.cn", "https://admin.idvasg.cn", "https://www.idvasg.cn" }; builder.Services.AddCors(options => options.AddDefaultPolicy(builder => builder.WithOrigins(urls) .AllowAnyMethod().AllowAnyHeader().AllowCredentials())); IServiceCollection services = builder.Services; services.AddDbContext(opt => { string connStr = @"Host=172.30.121.91;Port=2345;Database=postgres;Username=asg;Password=luolan12323;"; opt.UseNpgsql(connStr); }); //services.AddHostedService(); services.AddDataProtection(); services.AddIdentityCore(options => { options.Password.RequireDigit = false; options.Password.RequireLowercase = false; options.Password.RequireNonAlphanumeric = false; options.Password.RequireUppercase = false; options.Password.RequiredLength = 6; options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider; options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider; }); var idBuilder = new IdentityBuilder(typeof(User), typeof(Role), services); idBuilder.AddEntityFrameworkStores() .AddDefaultTokenProviders() .AddRoleManager>() .AddUserManager>(); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(); //add error 处理器 builder.Services.Configure(options => { options.Filters.Add(); }); services.Configure(builder.Configuration.GetSection("JWT")); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(x => { var jwtOpt = builder.Configuration.GetSection("JWT").Get(); byte[] keyBytes = Encoding.UTF8.GetBytes(jwtOpt.SigningKey); var secKey = new SymmetricSecurityKey(keyBytes); x.TokenValidationParameters = new() { ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ValidateIssuerSigningKey = true, IssuerSigningKey = secKey }; }); services.AddSingleton(new GithubOAuth(OAuthConfig.LoadFrom(builder.Configuration, "oauth:github"))); services.AddSingleton(new MicrosoftOAuth(OAuthConfig.LoadFrom(builder.Configuration, "oauth:microsoft"))); builder.Services.AddApplicationInsightsTelemetry(); var app = builder.Build(); //app.MapDefaultEndpoints(); app.UseCors(); // Configure the HTTP request pipeline. app.UseSwagger(); //app.UseSwaggerUI(); app.MapScalarApiReference(options => { options.WithOpenApiRoutePattern("/swagger/v1/swagger.json"); // or options.OpenApiRoutePattern = "/swagger/v1/swagger.json"; }); app.UseStaticFiles(); AppContext.SetSwitch("System.Drawing.EnableUnixSupport", true); // 注册静态资源 void RegisterStaticFiles(string folderName, string requestPath) { string folderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, folderName); if (!Directory.Exists(folderPath)) { Directory.CreateDirectory(folderPath); } app.UseStaticFiles(new StaticFileOptions { FileProvider = new PhysicalFileProvider(folderPath), RequestPath = requestPath }); } RegisterStaticFiles("loge", "/loge"); RegisterStaticFiles("video", "/video"); RegisterStaticFiles("doc", "/doc"); RegisterStaticFiles("excel", "/excel"); app.UseAuthentication(); app.UseAuthorization(); app.MapHub("/room"); app.UseResponseCaching(); app.MapControllers(); new Thread(o => { try { var builder1 = FlandreApp.CreateBuilder(new HostApplicationBuilderSettings { Args = args, ContentRootPath = AppDomain.CurrentDomain.BaseDirectory }); // 安装一个适配器,并添加在这里。 // builder.Adapters.Add(new YourAdapter()); builder1.Adapters.AddOneBot(builder1.Configuration.GetSection("Adapters:OneBot")); builder1.Plugins.Add(); var app1 = builder1.Build(); // 添加内置中间件。 // 这些中间件保证 Flandre 的正常运转。你也可以加入自己的中间件,并灵活调整其顺序。 app1.UseCommandSession(); // app.UseMiddleware(async (ctx, next) => { /* ... */ }); app1.UseCommandParser(); app1.UseCommandInvoker(); runbot.runbotr = app1.Bots.First(); app1.Run(); } catch (Exception ex) { //输出详细全部信息 Console.WriteLine(ex.ToString()); } }) { IsBackground = true }.Start(); app.Run();