diff --git a/Login/QrCodeLogin.cs b/Login/QrCodeLogin.cs
new file mode 100644
index 0000000..4f54ec4
--- /dev/null
+++ b/Login/QrCodeLogin.cs
@@ -0,0 +1,41 @@
+using Lagrange.Core;
+using Lagrange.Core.Common;
+using Lagrange.Core.Common.Interface;
+using Lagrange.Core.Common.Interface.Api;
+using Microsoft.Extensions.Configuration;
+using Microsoft.Extensions.DependencyInjection;
+using Console = System.Console;
+using JsonSerializer = System.Text.Json.JsonSerializer;
+
+namespace YounBot.Login;
+
+public static class QrCodeLogin
+{
+ public static async Task Login(YounBotApp app, BotConfig config, BotDeviceInfo deviceInfo, BotKeystore keystore)
+ {
+ app.Client = BotFactory.Create(config, deviceInfo, keystore);
+ var client = app.Client;
+
+ client.Invoker.OnBotLogEvent += (_, @event) => {
+ Console.WriteLine(@event.ToString());
+ };
+
+ client.Invoker.OnBotOnlineEvent += (_, @event) =>
+ {
+ Console.WriteLine(@event.ToString());
+ client.UpdateKeystore();
+ File.WriteAllText(app.Configuration["ConfigPath:Keystore"] ?? "keystore.json", JsonSerializer.Serialize(keystore));
+ };
+
+ if (!await app.Client.LoginByPassword())
+ {
+ var qrCode = await client.FetchQrCode();
+
+ if (qrCode != null)
+ {
+ await File.WriteAllBytesAsync("qrcode.png", qrCode.Value.QrCode);
+ await app.Client.LoginByQrCode();
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/Program.cs b/Program.cs
index 81073f3..f30b6e4 100644
--- a/Program.cs
+++ b/Program.cs
@@ -6,13 +6,13 @@
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
+using YounBot.Login;
namespace YounBot;
class Program
{
- static void Main(string[] args)
- {
+ public static async Task Main() {
// thanks to Lagrange.OneBot
Console.OutputEncoding = Encoding.UTF8;
Console.InputEncoding = Encoding.UTF8;
@@ -21,10 +21,9 @@ static void Main(string[] args)
if (!File.Exists("appsettings.json"))
{
- Console.WriteLine("No exist config file, create it now...");
var assm = Assembly.GetExecutingAssembly();
- using var istr = assm.GetManifestResourceStream("Lagrange.OneBot.Resources.appsettings.json")!;
+ using var istr = assm.GetManifestResourceStream("YounBot.Resources.appsettings.json")!;
using var temp = File.Create("appsettings.json");
istr.CopyTo(temp);
@@ -34,25 +33,21 @@ static void Main(string[] args)
Console.WriteLine("Please Edit the appsettings.json to set configs and press any key to continue");
Console.ReadLine();
}
-
- // 创建IServiceCollection实例
- var services = new ServiceCollection();
+
// 创建IConfiguration实例
var configurationBuilder = new ConfigurationBuilder()
- .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
+ .AddJsonFile("appsettings.json", false, true)
.AddEnvironmentVariables();
var configuration = configurationBuilder.Build();
-
// 创建YounBotAppBuilder实例
- var appBuilder = new YounBotAppBuilder(services, configuration);
-
+ var appBuilder = new YounBotAppBuilder(configuration);
+ var app = appBuilder.Build();
// 配置应用程序
- appBuilder
- .ConfigureBots()
- .ConfigureLogging(logging => logging.AddConsole());
+ appBuilder.ConfigureBots();
+
+ //登录
+ await QrCodeLogin.Login(app, appBuilder.GetConfig(), appBuilder.GetDeviceInfo(), appBuilder.GetKeystore());
- // 构建应用程序
- var app = appBuilder.Build();
}
}
\ No newline at end of file
diff --git a/YounBot.csproj b/YounBot.csproj
index 68d5df8..d26802e 100644
--- a/YounBot.csproj
+++ b/YounBot.csproj
@@ -18,4 +18,9 @@
+
+
+
+
+
diff --git a/YounBotApp.cs b/YounBotApp.cs
index b7a4d86..cffa772 100644
--- a/YounBotApp.cs
+++ b/YounBotApp.cs
@@ -1,16 +1,11 @@
-using Microsoft.Extensions.Configuration;
+using Lagrange.Core;
+using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace YounBot;
-public class YounBotApp
+public class YounBotApp(YounBotAppBuilder appBuilder)
{
- public IServiceCollection Services;
- public IConfiguration Configuration;
-
- public YounBotApp(YounBotAppBuilder builder)
- {
- Services = builder.GetServices();
- Configuration = builder.GetConfiguration();
- }
+ public readonly IConfiguration Configuration = appBuilder.GetConfiguration();
+ public BotContext? Client;
}
\ No newline at end of file
diff --git a/YounBotAppBuilder.cs b/YounBotAppBuilder.cs
index 495b3d9..9391f13 100644
--- a/YounBotAppBuilder.cs
+++ b/YounBotAppBuilder.cs
@@ -1,5 +1,8 @@
+using System.Text.Json.Serialization;
+using Lagrange.Core;
using Lagrange.Core.Common;
using Lagrange.Core.Common.Interface;
+using Lagrange.Core.Common.Interface.Api;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
@@ -7,40 +10,36 @@
namespace YounBot;
-public sealed class YounBotAppBuilder
+public sealed class YounBotAppBuilder(IConfiguration configuration)
{
- private IServiceCollection Services;
-
- private IConfiguration Configuration;
-
- public YounBotAppBuilder(IServiceCollection services, IConfiguration configuration)
- {
- Services = services;
- Configuration = configuration;
- }
+ private BotDeviceInfo _deviceInfo;
+ private BotKeystore _keystore;
+ private BotConfig _botConfig;
- public IServiceCollection GetServices() => Services;
- public IConfiguration GetConfiguration() => Configuration;
-
- public YounBotAppBuilder ConfigureBots()
+ public IConfiguration GetConfiguration() => configuration;
+ public BotDeviceInfo GetDeviceInfo() => _deviceInfo;
+ public BotKeystore GetKeystore() => _keystore;
+ public BotConfig GetConfig() => _botConfig;
+
+ public void ConfigureBots()
{
- string keystorePath = Configuration["ConfigPath:Keystore"] ?? "keystore.json";
- string deviceInfoPath = Configuration["ConfigPath:DeviceInfo"] ?? "device.json";
+ string keystorePath = configuration["ConfigPath:Keystore"] ?? "keystore.json";
+ string deviceInfoPath = configuration["ConfigPath:DeviceInfo"] ?? "device.json";
- bool isSuccess = Enum.TryParse(Configuration["Account:Protocol"], out var protocol);
- var config = new BotConfig
+ bool isSuccess = Enum.TryParse(configuration["Account:Protocol"], out var protocol);
+
+ _botConfig = new BotConfig
{
Protocol = isSuccess ? protocol : Protocols.Linux,
- AutoReconnect = bool.Parse(Configuration["Account:AutoReconnect"] ?? "true"),
- UseIPv6Network = bool.Parse(Configuration["Account:UseIPv6Network"] ?? "false"),
- GetOptimumServer = bool.Parse(Configuration["Account:GetOptimumServer"] ?? "true"),
- AutoReLogin = bool.Parse(Configuration["Account:AutoReLogin"] ?? "true"),
+ AutoReconnect = bool.Parse(configuration["Account:AutoReconnect"] ?? "true"),
+ UseIPv6Network = bool.Parse(configuration["Account:UseIPv6Network"] ?? "false"),
+ GetOptimumServer = bool.Parse(configuration["Account:GetOptimumServer"] ?? "true"),
+ AutoReLogin = bool.Parse(configuration["Account:AutoReLogin"] ?? "true"),
};
-
- BotKeystore keystore;
+
if (!File.Exists(keystorePath))
{
- keystore = new BotKeystore();
+ _keystore = new BotKeystore();
string? directoryPath = Path.GetDirectoryName(keystorePath);
if (!string.IsNullOrEmpty(directoryPath))
{
@@ -49,14 +48,13 @@ public YounBotAppBuilder ConfigureBots()
}
else
{
- keystore = JsonSerializer.Deserialize(File.ReadAllText(keystorePath)) ?? new BotKeystore();
+ _keystore = JsonSerializer.Deserialize(File.ReadAllText(keystorePath)) ?? new BotKeystore();
}
- BotDeviceInfo deviceInfo;
if (!File.Exists(deviceInfoPath))
{
- deviceInfo = BotDeviceInfo.GenerateInfo();
- string json = JsonSerializer.Serialize(deviceInfo);
+ _deviceInfo = BotDeviceInfo.GenerateInfo();
+ string json = JsonSerializer.Serialize(_deviceInfo);
string? directoryPath = Path.GetDirectoryName(deviceInfoPath);
if (!string.IsNullOrEmpty(directoryPath))
{
@@ -66,18 +64,8 @@ public YounBotAppBuilder ConfigureBots()
}
else
{
- deviceInfo = JsonSerializer.Deserialize(File.ReadAllText(deviceInfoPath)) ?? BotDeviceInfo.GenerateInfo();
+ _deviceInfo = JsonSerializer.Deserialize(File.ReadAllText(deviceInfoPath)) ?? BotDeviceInfo.GenerateInfo();
}
-
- Services.AddSingleton(BotFactory.Create(config, deviceInfo, keystore));
-
- return this;
- }
-
- public YounBotAppBuilder ConfigureLogging(Action configureLogging)
- {
- Services.AddLogging(configureLogging);
- return this;
}
public YounBotApp Build() => new(this);