Lagrange.Core icon indicating copy to clipboard operation
Lagrange.Core copied to clipboard

[Feature Request]: 希望有更多的Lagrange.Core的C#示例

Open Lixeer opened this issue 4 months ago • 1 comments

Lagrange项目

Core

新需求内容

我希望将Core直接集成到我的应用当中,但是现在例程有限(一个我也没找到),我尝试在Largrance.Onebot中找到一些关于Core的调用过程,无奈抽象层级太多。
而后我在v2中,找到了run,里面的部分代码还不足以支持我编写一个简单的应用。
编写少量的例程对于纠错,衍生项目发展等等是有益。 真心希望。

Lixeer avatar Aug 02 '25 18:08 Lixeer

这是一个实现了登录、回复群消息、好友消息的简单示例,调用LagrangeRunning.RunSync()后扫码登录即可。 using Lagrange.Core; using Lagrange.Core.Common; using Lagrange.Core.Common.Entity; using Lagrange.Core.Common.Interface; using Lagrange.Core.Common.Interface.Api; using Lagrange.Core.Event.EventArg; using Lagrange.Core.Message; using Lagrange.Core.Message.Entity; using System.Diagnostics; using System.Threading.Tasks;

namespace QQBot

{ ///

/// 提供机器人运行的核心静态类,负责初始化、登录、事件处理和消息收发。 /// public static class LagrangeRunning { /// /// 机器人上下文实例,用于与QQ协议进行交互。只读。 /// static readonly BotContext _bot; /// /// 指示机器人是否在线的状态。可读写。 /// static bool _isOnline = false; static uint _botqq = Config.botQQ;

    /// <summary>
    /// 静态构造函数,在类首次加载时执行,用于创建和初始化机器人实例。
    /// </summary>
    static LagrangeRunning()
    {
        _bot = BotFactory.Create(new BotConfig(), LoadDeviceInfo(), LoadKeyStore());
        BotInit();

    }
    
    /// <summary>
    /// 初始化机器人,绑定各种事件处理器。
    /// </summary>
    static void BotInit()
    {

        _bot.Invoker.OnBotLogEvent += static (context, @event) =>
        {
            if (@event.Level != LogLevel.Debug) Console.WriteLine(@event.ToString());
        };

        _bot.Invoker.OnBotOnlineEvent += static (context, @event) =>
        {
            Console.WriteLine(@event.ToString());
            _isOnline = true;
        };

        _bot.Invoker.OnBotOfflineEvent += (context, @event) =>
        {
            Console.WriteLine(@event.ToString());
            _isOnline = false;
        };

        _bot.Invoker.OnGroupMessageReceived += (context, @event) => HandleGroupMessage(@event);
        _bot.Invoker.OnFriendMessageReceived += (context, @event) => HandleFriendMessage(@event);
        _bot.Invoker.OnTempMessageReceived += (context, @event) => HandleTempMessage(@event);
        _bot.Invoker.OnGroupMemberIncreaseEvent += (context, @event) => HandleIncrease(@event);
        _bot.Invoker.OnFriendRequestEvent += static async (context, @event) => await AcceptFrient(@event);
        _bot.Invoker.OnGroupJoinRequestEvent += static async (context, @event) => await GroupJoinRequestDeal(context);
    }


    /// <summary>
    /// 异步运行机器人,处理登录逻辑(二维码或密码登录)并等待机器人上线。
    /// </summary>
    /// <returns>表示异步操作的任务。</returns>
    public static async Task RunSync()
    {
        try
        {
            if (_bot.UpdateKeystore().Uin == 0)
            {
                var q = _bot.FetchQrCode().Result;
                var qrcode = q?.QrCode;
                //qrcode的内容为(string url,byte[],将qrcode的byte[]内容保存为png图片)
                if (qrcode != null)
                {
                    File.WriteAllBytes("qrcode.png", qrcode);
                    //调用系统软件打开二维码图片
                    _ = Process.Start(new ProcessStartInfo("qrcode.png") { UseShellExecute = true });
                    Console.WriteLine("请扫描二维码登录,按任意键继续...");
                    await _bot.LoginByQrCode();
                }
                else Console.WriteLine("获取二维码失败");

            }
            else
            {
                await _bot.LoginByPassword();
            }
            //等待机器人上线,如果已经上线,就初始化群组和群成员列表
            while (_isOnline == false)
            {
                await Task.Delay(5000);
                Console.WriteLine("等待机器人上线......");
            }
            Console.WriteLine("机器人已上线");
            var keystore = _bot.UpdateKeystore();
            _botqq = keystore.Uin;
            Utility.SaveJson(_bot.UpdateDeviceInfo(), "deviceinfo");
            Utility.SaveJson(keystore, "keystore");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"LagrangeBot运行异常:{ex.Message}");
        }

    }

    /// <summary>
    /// 从 "deviceinfo.json" 文件加载设备信息,如果文件不存在则生成新的设备信息。
    /// </summary>
    /// <returns>机器人设备信息对象。</returns>
    static BotDeviceInfo LoadDeviceInfo() => Utility.LoadJson<BotDeviceInfo>("deviceinfo") ?? BotDeviceInfo.GenerateInfo();

    /// <summary>
    /// 从 "keystore.json" 文件加载密钥存储信息,如果文件不存在则创建新的密钥存储对象。
    /// </summary>
    /// <returns>机器人密钥存储对象。</returns>
    static BotKeystore LoadKeyStore() => Utility.LoadJson<BotKeystore>("keystore") ?? new BotKeystore();

    /// <summary>
    /// 处理群成员增加事件,发送欢迎消息。
    /// </summary>
    /// <param name="event">群成员增加事件对象。</param>
    private static void HandleIncrease(GroupMemberIncreaseEvent @event)
    {
        //获取群成员信息并发送欢迎消息
        var message = MessageBuilder.Group(@event.GroupUin).Text(“welcomeMessage”).Mention(@event.MemberUin).Build();
        _bot.SendMessage(message);

    }
    /// <summary>
    /// 处理接收到的好友消息。
    /// </summary>
    /// <param name="m">好友消息事件对象。</param>
    private static void HandleFriendMessage(FriendMessageEvent m)
    {
        if (m.Chain.FriendUin == _botqq || _botqq == 0) return;
        var friendText = m.Chain.GetText();
        var answer = “hello”;
        if (answer is not null && answer.Length > 0)
        {
            var message = MessageBuilder.Friend(m.Chain.FriendUin).Text(answer).Build();
            _bot.SendMessage(message);
        }
    }

    /// <summary>
    /// 处理接收到的群组消息。
    /// </summary>
    /// <param name="g">群组消息事件对象。</param>
    private static void HandleGroupMessage(GroupMessageEvent g)
    {
        var SenderUin = g.Chain.FriendUin;
        if (SenderUin == _botqq || _botqq == 0) return;
            var messageBuilder = MessageBuilder.Group(groupid).Text("answer\n");
            if (g.Chain.IsCallMe())
            _bot.SendMessage(messageBuilder.Build());
        }
    }
    
    /// <summary>
    /// 扩展MessageChain类,用于获取文本信息
    /// </summary>       
    /// <returns>获取该chain的所有文本信息</returns>
    public static string GetText(this MessageChain chain)
    {
        var text = string.Join("", chain.OfType<TextEntity>().Select(t => t.Text));
        return text;
    }
}

}

lepollo avatar Sep 12 '25 16:09 lepollo