static void Main(string[] args) { Console.WriteLine("[QQ]配置初始化..."); session = new MiraiHttpSession(); if (!File.Exists("mirai.conf")) { JObject jb = new JObject(); jb.Add("host", "127.0.0.1"); jb.Add("port", 1234); jb.Add("auth", "passw0rd"); File.WriteAllText("mirai.conf", jb.ToString()); } string config = File.ReadAllText("mirai.conf"); JObject conf = JObject.Parse(config); options = new MiraiHttpSessionOptions(conf.Value <string>("host"), conf.Value <int>("port"), conf.Value <string>("auth")); Console.WriteLine("[QQ]等待Mirai..."); session.ConnectAsync(options, qq).Wait(); session.DisconnectedEvt += Session_DisconnectedEvt; session.FriendMessageEvt += Session_FriendMessageEvt; session.NewFriendApplyEvt += Session_NewFriendApplyEvt; Console.WriteLine("[QQ]已连接"); SignQueueHandler.session = session; if (File.Exists("./database.bin")) { Console.WriteLine("[Queue]加载保存的队列..."); try { SignQueueHandler.Load(); Console.WriteLine("[Queue]已加载" + SignQueueHandler.queue.Count + "个用户数据"); } catch (Exception err) { Console.WriteLine("[Queue]加载失败:" + err.Message + "\n" + err.StackTrace); } } while (true) { try { DateTime start = DateTime.Now; Console.WriteLine("[Timer] 计时器开始:" + start); SignQueueHandler.__ProceedQueue(); SignQueueHandler.Save(); Console.WriteLine("[Timer] 计时器结束:" + DateTime.Now + ", 用时" + (DateTime.Now - start).Seconds + "秒"); Thread.Sleep(10 * 60 * 1000); } catch (Exception err) { Console.WriteLine("[EXCEPTION] 消息循环内出现意外错误"); DumpError(err); } } }
public Task <bool> GroupMessage(MiraiHttpSession session, IGroupMessageEventArgs e) { var text = e.Chain.FirstOrDefault(m => m.Type == "Plain")?.ToString(); if (text == null) { return(new Task <bool>(() => false)); } handlers.Where(h => Regex.IsMatch(text, h.Key)).ToList().ForEach(h => h.Value.DoHandleAsync(session, e.Chain, e.Sender)); return(new Task <bool>(() => false)); }
public async Task <bool> TempMessage(MiraiHttpSession session, ITempMessageEventArgs e) { OnMessage(session, Utils.GetCQMessage(e.Chain), new Source { FromGroup = 0, FromQQ = e.Sender.Id, Session = session, IsTemp = true }); return(false); }
public async Task <bool> FriendMessage(MiraiHttpSession session, IFriendMessageEventArgs e) { IMessageBase[] chain = new IMessageBase[] { new PlainMessage($"收到了来自{e.Sender.Name}({e.Sender.Remark})[{e.Sender.Id}]的私聊消息:{string.Join(null, (IEnumerable<IMessageBase>)e.Chain)}") // / 好友昵称 / / 好友备注 / / 好友QQ号 / / 消息链 / }; await session.SendFriendMessageAsync(e.Sender.Id, chain); // 向消息来源好友异步发送由以上chain表示的消息 return(false); // 不阻断消息传递。如需阻断请返回true }
public async Task <bool> FriendMessage(MiraiHttpSession session, IFriendMessageEventArgs e) { await OnMessage(session, Utils.GetCQMessage(e.Chain), new Source { FromGroup = 0, FromQQ = e.Sender.Id, Session = session }); return(false); }
public static async Task Run(CommandParser.Default args, MiraiHttpSession session, IGroupMessageEventArgs e) { if (args.Next) { await GetNext(args, session, e); } else if (args.Today) { await GetToday(args, session, e); } }
public async Task <bool> FriendMessage(MiraiHttpSession session, IFriendMessageEventArgs e) // 法1: 使用 IMessageBase[] { var replyMsg = await MessageHandler(e); if (replyMsg == null) { return(true); } await session.SendFriendMessageAsync(e.Sender.Id, replyMsg /*, plain2, /* etc... */); return(false); // 不阻断消息传递。如需阻断请返回true }
public static async Task RunTemp(CommandParser.Config args, MiraiHttpSession session, ITempMessageEventArgs e) { await session.SendGroupMessageAsync(e.Sender.Group.Id, new AtMessage(e.Sender.Id), new PlainMessage("\r\n正在保存...")); var user = new User(e.Sender.Id) { Username = args.Username, Password = args.Password }; bool ok = await user.TrySave(); await session.SendGroupMessageAsync(e.Sender.Group.Id, new AtMessage(e.Sender.Id), new PlainMessage(ok ? "\r\n成功更改了配置。" : "抱歉,遇到了错误,请稍后再试。")); }
public async Task <bool> GroupMessage3(MiraiHttpSession session, IGroupMessageEventArgs e) // 法3: 使用 IMessageBuilder { IMessageBuilder builder = new MessageBuilder(); builder.AddPlainMessage($"收到了来自{e.Sender.Name}[{e.Sender.Id}]{{{e.Sender.Permission}}}的群消息:{string.Join(null, (IEnumerable<IMessageBase>)e.Chain)}"); // / 发送者群名片 / / 发送者QQ号 / / 发送者在群内权限 / / 消息链 / // builder.AddPlainMessage("QAQ").AddPlainMessage("QwQ")/* .AddAtMessage(123456) etc... */; // 你甚至可以一开始 new MessageBuilder() 的时候就开始 Chaining await session.SendGroupMessageAsync(e.Sender.Group.Id, builder /*, plain2, /* etc... */); // 向消息来源群异步发送由以上chain表示的消息 return(false); // 不阻断消息传递。如需阻断请返回true }
public QClient(string addr, int port, string passwd, long account) { MiraiHttpSessionOptions options = new MiraiHttpSessionOptions(addr, port, passwd); session = new MiraiHttpSession(); handler = new EventHandler(this); conversations = new List <Conversation>(); session.ConnectAsync(options, account).Wait(); friends = session.GetFriendListAsync().Result.ToList(); groups = session.GetGroupListAsync().Result.ToList(); session.AddPlugin(handler); }
public async Task <bool> FriendMessage3(MiraiHttpSession session, IFriendMessageEventArgs e) // 法3: 使用 params IMessageBase[] { IMessageBuilder builder = new MessageBuilder(); builder.AddPlainMessage($"收到了来自{e.Sender.Name}({e.Sender.Remark})[{e.Sender.Id}]的私聊消息:{string.Join(null, (IEnumerable<IMessageBase>)e.Chain)}"); // / 好友昵称 / / 好友备注 / / 好友QQ号 / / 消息链 / // builder.AddPlainMessage("QAQ").AddPlainMessage("QwQ")/* .AddAtMessage(123456) etc... */; // 你甚至可以一开始 new MessageBuilder() 的时候就开始 Chaining await session.SendFriendMessageAsync(e.Sender.Id, builder /*, plain2, /* etc... */); // 向消息来源群异步发送由以上chain表示的消息 return(false); // 不阻断消息传递。如需阻断请返回true }
public static async Task <string> GetName(this MiraiHttpSession session, long group, long qq) { try { return((await session.GetGroupMemberInfoAsync(qq, group)).Name); } catch (Exception e) { Log(LoggerLevel.Error, e.ToString()); return(qq.ToString()); } }
public async Task <bool> GroupMessage(MiraiHttpSession session, IGroupMessageEventArgs e) { // 临时消息和群消息一致, 不多写例子了 IMessageBase[] chain = new IMessageBase[] { new PlainMessage($"收到了来自{e.Sender.Name}[{e.Sender.Id}]{{{e.Sender.Permission}}}的群消息:{string.Join(null, (IEnumerable<IMessageBase>)e.Chain)}") // / 发送者群名片 / / 发送者QQ号 / / 发送者在群内权限 / / 消息链 / }; await session.SendGroupMessageAsync(e.Sender.Group.Id, chain); // 向消息来源群异步发送由以上chain表示的消息 return(false); // 不阻断消息传递。如需阻断请返回true }
public static async Task <List <Models.GroupMemberInfo> > GetMemberList(this MiraiHttpSession session, long groupId) { return((await session.GetGroupMemberListAsync(groupId)).Select(info => new Models.GroupMemberInfo { GroupId = groupId, QQId = info.Id, PermitType = info.Permission switch { GroupPermission.Owner => PermitType.Holder, GroupPermission.Administrator => PermitType.Manage, _ => PermitType.None } }).ToList());
public async Task Main(long qqId, string ip, int port, string autoKey) { MiraiHttpSessionOptions options = new MiraiHttpSessionOptions(ip, port, autoKey); await using MiraiHttpSession session = new MiraiHttpSession(); session.AddPlugin(new TempMessage()); session.AddPlugin(new FriendMessage()); session.AddPlugin(new GroupMessage()); bool stop = false; await session.ConnectAsync(options, qqId).ContinueWith(callback => { if (callback.IsFaulted) { stop = true; MessageBox.Show("连接失败,请检查Mirai是否已经正常启动并已配置mirai-api-http相关参数。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }); if (stop) { return; } Cache.SetTaskAtFixedTime(); string nickname = (await session.GetFriendListAsync()).Where(m => m.Id == qqId).FirstOrDefault().Name; Invoke(new Action(() => { lblState.Text = $"连接状态: 已连接到mirai-api-http, 登录昵称:{nickname}"; lblState.ForeColor = Color.Black; btnConnect.Text = "断开连接"; btnConnect.Click -= btnConnect_Click; btnConnect.Click += btnDeconnect_Click; })); while (true) { if (await Console.In.ReadLineAsync() == "exit") { Invoke(new Action(() => { btnConnect.Text = "连接到mirai-api-http"; lblState.Text = "连接状态: 未连接到mirai-api-http"; lblState.ForeColor = Color.Red; })); return; } } }
public async Task <bool> ImageMonitor(MiraiHttpSession session, IGroupMessageEventArgs e) { var chain = e.Chain; foreach (var msg in chain) { if (msg is ImageMessage image) { await using var file = new System.IO.StreamWriter("ImageMonitor.txt", true); await file.WriteLineAsync($"{DateTime.Now.ToLongTimeString()} {e.Sender.Group.Id} {e.Sender.Id} {e.Sender.Name} {image.Url}"); } } return(false); }
internal string PurchaseItem(GameAPI buyer, string guid, MiraiHttpSession Session) { var item = tradeItems.FirstOrDefault(x => x.UniqueId == guid); if (item == null) { return("找不到该商品!"); } if (buyer.Member.Member.QQId == item.Owner.Member.QQId) { if (!buyer.Member.Inventory.Any(x => x.Element.Name == item.Item.Name)) { buyer.Member.Inventory.Add(new InventoryItem() { ContainsCount = item.Amount, Element = item.Item }); } else { buyer.Member.Inventory.First(x => x.Element.Name == item.Item.Name).ContainsCount += item.Amount; } tradeItems.Remove(item); } else { if (buyer.Member.Cash < item.Price) { return("你没钱买个屁!"); } buyer.Member.Cash -= item.Price; if (!buyer.Member.Inventory.Any(x => x.Element.Name == item.Item.Name)) { buyer.Member.Inventory.Add(new InventoryItem() { ContainsCount = item.Amount, Element = item.Item }); } else { buyer.Member.Inventory.First(x => x.Element.Name == item.Item.Name).ContainsCount += item.Amount; } using (GameAPI owner = new GameAPI(item.Owner.Member.GroupId, item.Owner.Member.QQId, Session)) { owner.Member.Cash += item.Price; } tradeItems.Remove(item); } return("购买成功!"); }
public async Task <bool> GroupMemberPositiveLeave(MiraiHttpSession session, IGroupMemberPositiveLeaveEventArgs e) { Console.Write("[" + DateTime.Now.ToString("dd/MM/yyyy HH:mm:ss") + "] ", Color.Yellow); Console.Write("[LEAVE] ", Color.Firebrick); Console.Write("[" + e.Member.Group.Name + "]: ", Color.Orange); Console.WriteLine(e.Member.Name + "已退群"); if (File.Exists("com.coc.groupadmin\\" + e.Member.Group.Id + "\\" + e.Member.Id + ".bin")) { File.Delete("com.coc.groupadmin\\" + e.Member.Group.Id + "\\" + e.Member.Id + ".bin"); } await session.SendGroupMessageAsync(e.Member.Group.Id, new PlainMessage(e.Member.Name + "已退群!")); return(true); }
internal GameAPI(long group, long qqID, MiraiHttpSession Session) { this.Session = Session; groupPath = "com.coc.groupadmin\\" + group; MemberFile = "com.coc.groupadmin\\" + group + "\\" + qqID + ".bin"; if (!Directory.Exists(groupPath)) { Directory.CreateDirectory(groupPath); } if (!File.Exists(MemberFile)) { var Member = new GroupMemberInfo() { GroupId = group, QQId = qqID, Card = Session.GetGroupMemberInfoAsync(qqID, group).Result.Name }; GameMember gameMember; gameMember = new GameMember { Member = Member, Cash = 100, Exp = 100, Work = Work.给野蛮人刷背, Checked = DateTime.MinValue, Combo = 0, CurrentHP = 100, weapon = new None(), Robbed = DateTime.MinValue, PlayTime = DateTime.MinValue }; var writer = new XmlSerializer(typeof(GameMember)); using StreamWriter stream = new StreamWriter(MemberFile); writer.Serialize(stream, gameMember); } else { //Weird error if (File.ReadAllText(MemberFile).Contains("</GameMember>d>")) { File.WriteAllText(MemberFile, File.ReadAllText(MemberFile).Replace("</GameMember>d>", "")); } } try { XmlSerializer reader = new XmlSerializer(typeof(GameMember)); using (FileStream stream = new FileStream(MemberFile, FileMode.Open)) { this.Member = (GameMember)reader.Deserialize(stream); } foreach (Type type in Assembly.GetAssembly(typeof(Element)).GetTypes().Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(Element)))) { elements.Add((Element)Activator.CreateInstance(type)); } } catch (Exception ex) { Session.SendGroupMessage(group, new PlainMessage(qqID + "资料损毁,错误资料:" + ex.Message)); } }
public async Task <bool> MemberKick(MiraiHttpSession session, IGroupMessageEventArgs e) { if (!Config.ApplyedGroups.Contains(e.Sender.Group.Id)) { return(false); } string?command; bool iscommand = Utility.ProcessCommandSession(e, out command); if (!iscommand) { return(false); } var commandArgs = command.Split(' ', StringSplitOptions.RemoveEmptyEntries); if (commandArgs.Length != 2 || !memberKickCommandList.Contains(commandArgs[0])) { return(false); } long target; if (!long.TryParse(commandArgs[1], out target)) { await session.SendGroupMessageAsync(e.Sender.Group.Id, new IMessageBase[] { new PlainMessage("输入的参数有误") }, ((SourceMessage)e.Chain[0]).Id); return(false); } if (Global.currentTask[e.Sender.Group.Id] != null) { await session.SendGroupMessageAsync(e.Sender.Group.Id, new IMessageBase[] { new AtMessage(e.Sender.Id), new PlainMessage("已有命令注册,请等待被注册命令结束") }); return(false); } Global.currentTask[e.Sender.Group.Id] = new MemberKick(target, e.Sender.Group.Id, session); await Task.Delay(TimeSpan.FromMinutes(2)); if (Global.currentTask[e.Sender.Group.Id] != null) { await session.SendGroupMessageAsync(e.Sender.Group.Id, new PlainMessage("挂起的任务已超时")); } Global.currentTask[e.Sender.Group.Id] = null; return(false); }
public static async Task <bool> Listener(MiraiHttpSession session, IGroupMessageEventArgs e) { _ = Group.Groups.TryAdd(e.Sender.Group.Id, new Group(e.Sender.Group.Id)); var curgp = Group.Groups[e.Sender.Group.Id]; if (curgp.MessageQueue.Count <= curgp.MaxMessageNum) { curgp.MessageQueue.AddToBack(e); } else { curgp.MessageQueue.RemoveFromFront(); curgp.MessageQueue.AddToBack(e); } return(false); }
#pragma warning disable CS1998 // 异步方法缺少 "await" 运算符,将以同步方式运行 protected static async Task OnMessage(MiraiHttpSession session, string message, Source Sender) #pragma warning restore CS1998 // 异步方法缺少 "await" 运算符,将以同步方式运行 { if (!booted) { return; } bool isAdmin = AdminQQ == Sender.FromQQ || Configuration.GetConfig <Admin>().hash.Contains(Sender.FromQQ); long ticks = DateTime.Now.Ticks; if (IsIgnore(Sender)) { return; } Action <string> callback = delegate(string s) { try { Utils.Log(LoggerLevel.Debug, $"[{(DateTime.Now.Ticks - ticks) / 10000}ms] sent msg: " + s); if (Sender.FromGroup != 0) { session.SendGroupMessageAsync(Sender.FromGroup, Utils.GetMessageChain(s, p => session.UploadPictureAsync(UploadTarget.Group, p).Result)).Wait(); } else if (!Sender.IsTemp) { session.SendFriendMessageAsync(Sender.FromQQ, Utils.GetMessageChain(s, p => session.UploadPictureAsync(UploadTarget.Temp, p).Result)).Wait(); } else { session.SendTempMessageAsync(Sender.FromQQ, Sender.FromGroup, Utils.GetMessageChain(s, p => session.UploadPictureAsync(UploadTarget.Friend, p).Result)).Wait(); } } catch (Exception e) { Utils.Log(LoggerLevel.Error, "error in msg: " + s + "\n" + e.ToString()); } }; Utils.Log(LoggerLevel.Debug, "recv msg: " + message); Task.Run(() => { instance.OnMessage(message, Sender, isAdmin, callback); }).Start(); }
private static async Task <bool> OnFriendMessage(MiraiHttpSession sender, IFriendMessageEventArgs e) { var qq = e.Sender.Id; var msg = e.Chain.GetPlain(); var(matched, result) = new PrivateMessageHandler(qq, msg).ProcessCommandInput(); var img = e.Chain.OfType <ImageMessage>().FirstOrDefault(); if (img != null) { if (QQsReceivesImageSet.Any(s => s.QQ == qq.ToString())) { var student = QQsReceivesImageSet.First(s => s.QQ == qq.ToString()); QQsReceivesImageSet.RemoveWhere(s => s.QQ == qq.ToString()); var url = img.Url; var client = new HttpClient(); var image = await client.GetByteArrayAsync(url); if (ImageManager.ExistsAndIfRemove(student)) { SendPrivate(qq.ToString(), "注意: 你已经上传过照片, 这张照片将被覆盖"); } if (ImageManager.GetExtension(image) == null) { SendPrivate(qq.ToString(), "图片格式不支持."); return(true); } ImageManager.SaveImage(student, image); SendPrivate(qq.ToString(), "图片成功保存!"); } else { if (!Config.Instance.SentImageHint.Contains(qq.ToString())) { SendPrivate(qq.ToString(), "图片不能直接发送, 输入 help 或 帮助 来查看使用方法."); Config.Instance.SentImageHint.Add(qq.ToString()); Config.Save(); } } } return(true); }
public async Task <bool> OnAt(MiraiHttpSession session, IGroupMessageEventArgs e) { bool selfAted = e.Chain.Where(msg => msg is AtMessage) .Cast <AtMessage>() .Select(atmsg => atmsg.Target) .Contains(session.QQNumber.Value); if (selfAted) { var imgmsg = await session.UploadPictureAsync(UploadTarget.Group, @"..\..\..\images\kokoaCry.jpg"); await session.SendGroupMessageAsync(e.Sender.Group.Id, new IMessageBase[] { new PlainMessage("检测到您正在at我!主人很懒,不想实" + "现接受at信息调用我的模块,请直接使用文字命令来调用!"), imgmsg }, ((SourceMessage)e.Chain[0]).Id); } return(false); }
public async Task <bool> GroupMessage(MiraiHttpSession session, IGroupMessageEventArgs e) { if (e.GetMessage().IsCommand()) { var assembly = Assembly.GetExecutingAssembly(); var fileVersion = FileVersionInfo.GetVersionInfo(assembly.Location); switch (e.GetMessage()) { case "/Help": await session.SendPlainText(e, $"欢迎使用HeliumBot {fileVersion.FileVersion}", "===================", "/Help : 查看帮助", "/Genshin <uid> : 获取指定原神UID的公开信息", "/Genshin <uid> -Avatar : 获取指定原神UID的公开信息,并查看获得的角色", "/GenshinAbyss <uid> : 获取指定原神UID的深渊战绩", "/GenshinAbyss <uid> -Detail : 获取指定原神UID的深渊战绩,并且查看每层每间详情", "/Money : 给作者打钱", "/About : 查看Bot的关于信息"); break; case "/Money": var img = await session.UploadPictureAsync(UploadTarget.Group, await new HttpClient().GetStreamAsync("https://i.loli.net/2021/05/04/fXOm1xnrsBg45Zh.jpg")); await session.SendGroupMessageAsync(e.Sender.Group.Id, img); break; case "/About": await session.SendPlainText(e, $"HeliumBot {fileVersion.FileVersion}", $"Maintain by AHpx(https://github.com/AHpxChina)", $"Based on Mirai-CSharp(https://github.com/Executor-Cheng/Mirai-CSharp)", $"Open source repository on https://github.com/AHpxChina/HeliumBot", $"Acknowledgment:", $"mirai(https://github.com/mamoe/mirai)", $"mirai-api-http(https://github.com/mamoe/mirai-api-http)", $"mirai-console(https://github.com/mamoe/mirai-console)"); break; } } return(false); }
public Worker(ILogger <Worker> logger, MiraiHttpSession session, IOptions <MiraiSessionOptions> miraiSessionOptions, GarupaData data, IServiceProvider serviceProvider, BestdoriClient client) { _logger = logger; _session = session; _miraiSessionOptions = miraiSessionOptions; _client = client; _data = data; _serviceProvider = serviceProvider; _timer = new System.Timers.Timer(TimeSpan.FromHours(1).TotalMilliseconds); var plugins = Assembly.GetExecutingAssembly().DefinedTypes.Where(ti => ti.GetInterface("ITimeMessageHandler") != null).ToArray(); foreach (var plugin in plugins) { _handlers.Add((ITimeMessageHandler)serviceProvider.GetService(plugin.AsType())); } }
internal GameAPI(ChainEventArgs e) { Session = e.Session; groupPath = "com.coc.groupadmin\\" + e.FromGroup; MemberFile = "com.coc.groupadmin\\" + e.FromGroup + "\\" + e.FromQQ + ".bin"; if (!Directory.Exists(groupPath)) { Directory.CreateDirectory(groupPath); } if (!File.Exists(MemberFile)) { var Member = new GroupMemberInfo() { GroupId = e.FromGroup, QQId = e.FromQQ, Card = e.Sender.Name }; GameMember gameMember; gameMember = new GameMember { Member = Member, Cash = 100, Exp = 100, Work = Work.给野蛮人刷背, Checked = DateTime.MinValue, Combo = 0, CurrentHP = 100, weapon = new None(), Robbed = DateTime.MinValue, PlayTime = DateTime.MinValue }; var writer = new XmlSerializer(typeof(GameMember)); using StreamWriter stream = new StreamWriter(MemberFile); writer.Serialize(stream, gameMember); } try { XmlSerializer reader = new XmlSerializer(typeof(GameMember)); using (FileStream stream = new FileStream(MemberFile, FileMode.Open)) { this.Member = (GameMember)reader.Deserialize(stream); this.Member.Member = new GroupMemberInfo() { GroupId = e.FromGroup, QQId = e.FromQQ, Card = e.Sender.Name }; } foreach (Type type in Assembly.GetAssembly(typeof(Element)).GetTypes().Where(myType => myType.IsClass && !myType.IsAbstract && myType.IsSubclassOf(typeof(Element)))) { elements.Add((Element)Activator.CreateInstance(type)); } } catch (Exception ex) { e.Session.SendGroupMessage(e.FromGroup, new PlainMessage(e.FromQQ + "资料损毁,错误资料:" + ex.Message)); } }
public async Task <bool> GroupMessage(MiraiHttpSession session, IGroupMessageEventArgs e) { if (e.Sender.Group.Id != groupID) { return(false); } (App.Current as App).SendDanmu(new DanmuModel { AvatorUrl = $"https://qlogo4.store.qq.com/qzone/{e.Sender.Id}/{e.Sender.Id}/100", NickName = e.Sender.Name, QQNumber = e.Sender.Id.ToString(), EncodedContent = e.Chain }); MessageReceived?.Invoke(e); return(true); }
static async Task Main(string[] args) { var options = new MiraiHttpSessionOptions(Host, Port, AuthKey); await using var session = new MiraiHttpSession(); await session.ConnectAsync(options, QQNum); session.GroupMessageEvt += MessageQueueListener.Listener; session.AddPlugin(new Commands.GroupCommandForwarder()); session.AddPlugin(new Commands.TempCommandForwarder()); Tests.TestRuner.Run(); while (true) { if (await Console.In.ReadLineAsync() == "quit") { return; } } }
public async Task <bool> Disconnected(MiraiHttpSession session, IDisconnectedEventArgs e) { // e.Exception: 引发掉线的响应异常, 按需处理 MiraiHttpSessionOptions options = new MiraiHttpSessionOptions(Setting.Host, Setting.Port, Setting.AuthKey); while (true) { try { await session.ConnectAsync(options, Setting.QQ); // 连到成功为止, QQ号自填, 你也可以另行处理重连的 behaviour return(true); } catch (Exception) { await Task.Delay(1000); } } }