public void PrivateMessage(MsgReply rep, string msgtext, string[] pictures) { try { /* * if (msgtext.IndexOf("#") != 0) * { * try * { * var ticket = BroadTicketUtility.TicketCoder.Decode(msgtext); * long qq = DataBase.me.getUserBoundedQQ(ticket.Data.Uid); * if (qq <= 0) * { * DataBase.me.boundBiliWithQQ(ticket.Data.Uid, rep.qq); * rep.reply("已将您的QQ与Bilibili账号绑定。"); * qq = rep.qq; * } * if (qq != rep.qq) * { * rep.reply("我无法为您兑换船票,因为您Bilibili账号绑定的QQ与当前QQ不符。\n绑定的QQ:******" + qq.ToString()[6..] + "\n如果您确信这是一个误会,请联系运维@鸡蛋(1250542735)"); * MainHolder.broadcaster.BroadcastToAdminGroup("船票兑换失败\nQQ<" + rep.qq + ">试图兑换船票{Serial=" + ticket.Data.SerialNumber + "}\n该船票颁发给BiliUID#" + ticket.Data.Uid + "@QQ<" + qq + ">\n拒绝兑换。"); * return; * } * try * { * rep.reply(BroadTicketUtility.TicketCoder.Encode(ticket, false)); * MainHolder.broadcaster.BroadcastToAdminGroup("船票兑换成功\nQQ<" + rep.qq + ">试图兑换船票{Serial=" + ticket.Data.SerialNumber + "}\n该船票颁发给BiliUID#" + ticket.Data.Uid + "\n已兑换。"); * rep.reply("兑换成功,感谢您对鹿野的支持!"); * } * catch (Exception err) * { * MainHolder.broadcaster.BroadcastToAdminGroup("[Exception]\n兑换船票时发生了一个错误:\n" + err.Message + "\nStack:\n" + err.StackTrace); * rep.reply("出现了一个错误,无法为您生成船票。请复制本消息并联系运维@鸡蛋(1250542735)\n" + err.Message + "\nStack:\n" + err.StackTrace); * } * return; * } * catch { } * MainHolder.broadcaster.SendToAnEgg(msgtext); * } * else*/ {//是一条指令 try { string[] cmd = msgtext.Split(' '); switch (cmd[0]) { case "#reg": case "#注册": { if (cmd.Length < 3) { rep.reply("用法:\n" + cmd[0] + " 角色名 密码"); break; } if (DBHandler.me.isRegistered(rep.qq)) { rep.reply("您的QQ已经被绑定到一个MC账号,我们不允许重复注册。如果需要销号,请联系管理员。"); break; } else if (DBHandler.me.isNameTaken(cmd[1])) { rep.reply("这个用户名已经有人用了,换一个试试吧!"); break; } else if (cmd[2].Length < 5) { rep.reply("密码长度必须大于等于5位"); break; } else if (CheckEncode(cmd[1])) { rep.reply("用户名仅允许(A-Z,a-z,0-9,_),不允许特殊符号和中文。"); break; } bool succeed = true; bool mojang = false; succeed = succeed && MCServer.DBHandler.me.addUser(rep.qq, cmd[2]); succeed = succeed && MCServer.DBHandler.me.addProfile(cmd[1], rep.qq, out mojang); if (succeed) { { string uuid = DBHandler.me.getUserOwnedProfileUUID(rep.qq); string pname = DBHandler.me.getUserOwnedProfileName(rep.qq); List <Texture> l = new List <Texture>(); Dictionary <string, string> ddd = new Dictionary <string, string>(); ddd.Add("model", "slim"); Texture tt = new Texture("https://storage.microstorm.tech/skins/default.png", "SKIN", ddd); l.Add(tt); SkinHandler sh = new SkinHandler(DBHandler.me.getUserOwnedProfileUUID(rep.qq), DBHandler.me.getUserOwnedProfileName(rep.qq), l); if (DBHandler.me.setProfileUUIDTexture(uuid, sh.ToString())) { rep.reply("注册成功。使用以下信息登录:\n" + "用户名:" + rep.qq + "@qq.com\n" + "密码:" + cmd[2] + (mojang ? "\n[正版UUID]" : "")); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n玩家<" + cmd[1] + ">在认证服务器中注册" + (mojang ? "\n[正版UUID]" : "")); } else { rep.reply("注册成功,[但设置默认皮肤时发生了一些问题]。\n联系管理解决后,使用以下信息登录:\n" + "用户名:" + rep.qq + "@qq.com\n" + "密码:" + cmd[2] + (mojang ? "\n[正版UUID]" : "")); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n玩家<" + cmd[1] + ">在认证服务器中注册,但默认皮肤未能写入。【须进一步操作】" + (mojang ? "\n[正版UUID]" : "")); } } } else { rep.reply("无法与中央数据库通讯。请稍后重试。\n如果该问题持续出现,请联系@鸡蛋<1250542735>"); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n玩家<" + cmd[1] + ">在认证服务器中注册时发生错误。数据库连接不稳定。"); } } break; case "#skin": case "#皮肤": { if (cmd.Length < 2) { rep.reply("用法:\n" + cmd[0] + " https://xxxxx.xxxxx.xxxxx/xxx.png"); break; } if (!MCServer.SkinHandler.CheckSkinSourceTrusted(cmd[1])) { rep.reply("使用的图像URL无效。URL必须格式正确且来自可信的图像服务器。"); return; } if (!MCServer.SkinHandler.checkPick(cmd[1])) { rep.reply("图片格式有误。必须是有效PNG图片,且为64*32或64*64比例。"); return; } string uuid = DBHandler.me.getUserOwnedProfileUUID(rep.qq); string pname = DBHandler.me.getUserOwnedProfileName(rep.qq); string oldtdata = DBHandler.me.getProfileUUIDTexture(uuid); List <Texture> l = new List <Texture>(); if (oldtdata != null) { JObject oldtexture = (JObject)JsonConvert.DeserializeObject(oldtdata); if (oldtexture["textures"]["CAPE"] != null) { Dictionary <string, string> ddd = new Dictionary <string, string>(); Texture tt = new Texture(oldtexture["textures"]["CAPE"].Value <string>("url"), "CAPE", ddd); l.Add(tt); } } Dictionary <string, string> d = new Dictionary <string, string>(); d.Add("model", "slim"); Texture t = new Texture(cmd[1], "SKIN", d); l.Add(t); SkinHandler sh = new SkinHandler(DBHandler.me.getUserOwnedProfileUUID(rep.qq), DBHandler.me.getUserOwnedProfileName(rep.qq), l); if (DBHandler.me.setProfileUUIDTexture(uuid, sh.ToString())) { rep.reply("操作成功,您的皮肤已设置。"); } else { rep.reply("操作失败"); } } break; case "#UUID_RESET": case "#离线化UUID": { string __uuid = DBHandler.me.getUserOwnedProfileUUID(rep.qq); string __pname = DBHandler.me.getUserOwnedProfileName(rep.qq); bool mmojang; string nsu = DBHandler.genNoSlashUUID(__pname, out mmojang); string su = DBHandler.genSlashUUID(__pname); if (DBHandler.me.changeProfileUUID(__uuid, nsu, su) && mmojang) { rep.reply("您(" + __pname + ")的UUID已更新:\n旧UUID:" + __uuid + "\n新UUID:" + nsu); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n" + __pname + "发起了UUID更新\n旧UUID:" + __uuid + "\n新UUID:" + nsu + "\n√ 通过"); } else { rep.reply("您(" + __pname + ")的UUID无法更新。数据库出错或非Mojang账号\n旧UUID:" + __uuid); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n" + __pname + "发起了UUID更新\n旧UUID:" + __uuid + "\n新UUID:" + nsu + "\n× 失败"); } } break; case "#cloneuuid": { string __uuid; if (cmd.Length == 3) { __uuid = DBHandler.me.getUserOwnedProfileUUID(long.Parse(cmd[2])); } else { __uuid = DBHandler.me.getUserOwnedProfileUUID(rep.qq); } string __pname = cmd[1]; bool mmojang; string nsu = DBHandler.genNoSlashUUID(__pname, out mmojang); string su = DBHandler.genSlashUUID(__pname); if (!mmojang) { rep.reply("无法获取" + __pname + "的UUID,因此无法克隆。"); } else { rep.reply("您申请克隆" + __pname + "的UUID,请等待管理员操作。"); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n" + __pname + "发起了UUID更新\n旧UUID:" + __uuid + "\n新UUID:" + nsu + "\n#cloneuuid " + __pname + " " + rep.qq + ""); } } break; case "#cape": case "#披风": break; default: break; } } catch (Exception err) { rep.reply("执行指令出错。请检查指令及其参数是否正确。如果确认操作无误,请将下面的信息转发给@鸡蛋"); rep.reply("未处理的异常:" + err.Message + "\n堆栈追踪:" + err.StackTrace); } if (DataBase.me.isUserOperator(rep.qq))//管理才能用的指令 { try { string[] cmd = msgtext.Split(' '); switch (cmd[0]) { case "#dreg": { if (cmd.Length < 3) { rep.reply("用法:\n" + cmd[0] + " QQ 角色名 密码"); break; } long qq = long.Parse(cmd[1]); string name = cmd[2]; string passwd = cmd[3]; if (DBHandler.me.isRegistered(qq)) { rep.reply("QQ已经被绑定到一个MC账号,我们不允许重复注册。如果需要销号,请联系管理员。"); break; } else if (DBHandler.me.isNameTaken(name)) { rep.reply("这个用户名已经有人用了,换一个试试吧!"); break; } else if (passwd.Length < 5) { rep.reply("密码长度必须大于等于5位"); break; } else if (CheckEncode(name)) { rep.reply("用户名仅允许(A-Z,a-z,0-9,_),不允许特殊符号和中文。"); break; } bool succeed = true; bool mojang = false; succeed = succeed && MCServer.DBHandler.me.addUser(qq, passwd); succeed = succeed && MCServer.DBHandler.me.addProfile(name, qq, out mojang); if (succeed) { { string uuid = DBHandler.me.getUserOwnedProfileUUID(qq); string pname = DBHandler.me.getUserOwnedProfileName(qq); List <Texture> l = new List <Texture>(); Dictionary <string, string> ddd = new Dictionary <string, string>(); ddd.Add("model", "slim"); Texture tt = new Texture("https://storage.microstorm.tech/skins/default.png", "SKIN", ddd); l.Add(tt); SkinHandler sh = new SkinHandler(DBHandler.me.getUserOwnedProfileUUID(qq), DBHandler.me.getUserOwnedProfileName(qq), l); if (DBHandler.me.setProfileUUIDTexture(uuid, sh.ToString())) { rep.reply("注册成功。使用以下信息登录:\n" + "用户名:" + qq + "@qq.com\n" + "密码:" + passwd + (mojang ? "\n[正版UUID]" : "")); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n玩家<" + name + ">在认证服务器中注册" + (mojang ? "\n[正版UUID]" : "")); } else { rep.reply("注册成功,[但设置默认皮肤时发生了一些问题]。\n联系管理解决后,使用以下信息登录:\n" + "用户名:" + qq + "@qq.com\n" + "密码:" + passwd + (mojang ? "\n[正版UUID]" : "")); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n玩家<" + name + ">在认证服务器中注册,但默认皮肤未能写入。【须进一步操作】" + (mojang ? "\n[正版UUID]" : "")); } } } else { rep.reply("无法与中央数据库通讯。请稍后重试。\n如果该问题持续出现,请联系@鸡蛋<1250542735>"); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n玩家<" + name + ">在认证服务器中注册时发生错误。数据库连接不稳定。"); } } break; case "#cloneuuid": { string __uuid; if (cmd.Length == 3) { __uuid = DBHandler.me.getUserOwnedProfileUUID(long.Parse(cmd[2])); } else { __uuid = DBHandler.me.getUserOwnedProfileUUID(rep.qq); } string __pname = cmd[1]; bool mmojang; string nsu = DBHandler.genNoSlashUUID(__pname, out mmojang); string su = DBHandler.genSlashUUID(__pname); if (DBHandler.me.changeProfileUUID(__uuid, nsu, su) && mmojang) { rep.reply("您(" + __pname + ")的UUID已更新:\n旧UUID:" + __uuid + "\n新UUID:" + nsu); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n" + __pname + "发起了UUID更新\n旧UUID:" + __uuid + "\n新UUID:" + nsu + "\n√ 通过"); } else { rep.reply("您(" + __pname + ")的UUID无法更新。数据库出错或非Mojang账号\n旧UUID:" + __uuid); MainHolder.broadcaster.BroadcastToAdminGroup("[MC AUTH SERVER]\n" + __pname + "发起了UUID更新\n旧UUID:" + __uuid + "\n新UUID:" + nsu + "\n× 失败"); } } break; case "#查重": { rep.reply("====查重开始====\n" + "该操作需要大量数据库操作,请耐心等待\n" + "!如果发现结果不正确,请在对应群发送\n" + "#REFETCH_MEMBERS\n" + "!来重新同步数据"); Dictionary <long, List <long> > li; if (!(cmd.Length > 1 && ((cmd[1] == "从缓存") || (cmd[1] == "cache")))) { li = DataBase.me.findMeUser(); } else { li = me_user_tmp; } foreach (KeyValuePair <long, List <long> > groups in li) { if (DataBase.me.isUserOperator(groups.Key)) { continue; } string gps = ""; foreach (long group in groups.Value) { gps += DataBase.me.getGroupName(group) + "(" + group + ")\n"; } if (!(cmd.Length > 1 && ((cmd[1] == "计数") || (cmd[1] == "count")))) { rep.reply(new UserData(groups.Key).name + "(" + groups.Key + ")\n" + "该用户同时在这些群:\n" + gps); } } me_user_tmp = li; rep.reply("共发现" + li.Count + "个重复加群用户\n" + "====查重结束====\n"); } break; case "#更新群": case "#refetch": { rep.reply("!该操作涉及大量数据库操作,需要一定时间"); DataBase.me.update_groupmembers(long.Parse(cmd[1])); rep.reply("已更新群成员数据"); } break; case "#初始化群": case "#init_group": { rep.reply("!该操作涉及大量数据库操作,需要一定时间"); DataBase.me.init_groupdata(long.Parse(cmd[1])); rep.reply("已完成群初始化"); } break; case "#手动拉黑": case "#ban": { if (DataBase.me.addUserBlklist(long.Parse(cmd[1]), ( (cmd.Length > 2 ? (cmd[2]) : ("管理员手动拉黑")) ), rep.qq)) { string name = ""; try { name = "<" + new UserData(long.Parse(cmd[1])).name + ">"; } catch { name = "* <UNKNOWN>"; } rep.reply("已将" + name + "加入黑名单"); } else { rep.reply("无法执行该操作,中央数据库可能暂时不可用"); } } break; case "#清缓存": case "#clearcache": { me_user_tmp.Clear(); MainHolder.clearcache(); DataBase.me.clearCache(); rep.reply("√ 缓存已清空"); } break; case "#验证": case "#check": int uid, len, level, tstamp; if (CrewKeyProcessor.checkToken(cmd[1], out uid, out len, out level, out tstamp)) { string dpword = "??未知??"; switch (level) { case 1: dpword = "总督"; break; case 2: dpword = "提督"; break; case 3: dpword = "舰长"; break; } rep.reply("签名有效√\n" + "颁发给UID:" + uid + "\n" + "用以证明购买 " + dpword + "*" + len + " 月\n" + "颁发时间:" + BiliApi.TimestampHandler.GetDateTime(tstamp) + "\n" + "\n" + "⚠该凭据仅表明以上购买信息真实有效,不做其它用途"); } else { rep.reply("该凭据签名无效×\n" + "⚠该凭据无法被正确解码或签名失效。这可能意味着它包含的信息遭到篡改。不要信任该凭据指示的任何信息。"); } break; case "#cape": case "#披风": { long qq = -1; string url = ""; if (cmd.Length < 3) { if (!long.TryParse(cmd[1], out qq)) { rep.reply("!正在操作您自己的账号"); qq = rep.qq; url = cmd[1]; } else { if (cmd.Length < 2) { rep.reply("用法:\n" + cmd[0] + " (玩家QQ) 图片URL"); break; } url = cmd[2]; } } if (qq < 0) { qq = long.Parse(cmd[1]); } if (!MCServer.SkinHandler.checkPick(url)) { rep.reply("图片格式有误。必须是有效PNG图片,且为64*32或64*64比例。"); break; } string uuid = DBHandler.me.getUserOwnedProfileUUID(qq); string pname = DBHandler.me.getUserOwnedProfileName(qq); string oldtdata = DBHandler.me.getProfileUUIDTexture(uuid); List <Texture> l = new List <Texture>(); if (oldtdata != null) { JObject oldtexture = (JObject)JsonConvert.DeserializeObject(oldtdata); if (oldtexture["textures"]["SKIN"] != null) { Dictionary <string, string> ddd = new Dictionary <string, string>(); ddd.Add("model", "slim"); Texture tt = new Texture(oldtexture["textures"]["SKIN"].Value <string>("url"), "SKIN", ddd); l.Add(tt); } } Dictionary <string, string> d = new Dictionary <string, string>(); Texture t = new Texture(url, "CAPE", d); l.Add(t); SkinHandler sh = new SkinHandler(DBHandler.me.getUserOwnedProfileUUID(rep.qq), DBHandler.me.getUserOwnedProfileName(rep.qq), l); if (DBHandler.me.setProfileUUIDTexture(uuid, sh.ToString())) { rep.reply("操作成功,已为玩家" + pname + "设置披风。\n" + url); } else { rep.reply("操作失败"); } } break; default: break; } } catch (Exception err) { rep.reply("执行指令出错。请检查指令及其参数是否正确。如果确认操作无误,请将下面的信息转发给@鸡蛋"); rep.reply("未处理的异常:" + err.Message + "\n堆栈追踪:" + err.StackTrace); } } } } catch (Exception err) { MainHolder.broadcaster.BroadcastToAdminGroup("[Exception]\n这条消息可能意味着机器人发生了错误。它仍在继续运行,但可能不是很稳定。下面的信息用来帮助鸡蛋定位错误,管理不必在意。\n[私聊信息处理]" + err.Message + "\n\n堆栈跟踪:\n" + err.StackTrace); } }
private static void Main(string[] args) { #if DEBUG logger("DEBUG", "WARNING: Running in debug mode."); DEBUGMODE = true; Thread.Sleep(5000); #endif DateTime start = DateTime.Now; //string ipv4_ip = NetworkInfo.GetLocalIpAddress(); MainHolder.logger = logger; bool booted = false; Exception exc = null; #region 读取配置 StreamReader cfile = new StreamReader("config.json"); JObject config = (JObject)JsonConvert.DeserializeObject(cfile.ReadToEnd()); cfile.Close(); host = config["mirai"].Value <string>("server"); me_qq = config["mirai"].Value <long>("user"); key = config["mirai"].Value <string>("key"); try { port = config["mirai"].Value <int>("port"); } catch { port = 8080; } authenti = config["auth"].Value <string>("name"); MainHolder.LiveRoom = config["bili"].Value <int>("roomid"); MainHolder.BiliWatchUIDs = new List <int>(); foreach (JToken j in config["bili"]["uids"]) { MainHolder.BiliWatchUIDs.Add(j.Value <int>()); } MainHolder.useBiliRecFuncs = config["auth"].Value <bool>("rectfunc"); MainHolder.enableNativeFuncs = config["auth"].Value <bool>("nativefuncs"); //如果是本地ip就走本地 //if (host == ipv4_ip && Environment.OSVersion.Platform != PlatformID.Win32NT) //{ // logger("MainThread", "Running on the same server! Using 127.0.0.1 to connect mirai."); // host = "127.0.0.1"; //} #endregion while (true)//故障自动重启 { try { //Console.Title = "ManageBot By Developer_ken - Initializing..."; logger("MainThread", "Pushing up the engine...", ConsoleColor.Black, ConsoleColor.Green); { IServiceProvider services = new ServiceCollection().AddMiraiBaseFramework() // 表示使用基于基础框架的构建器 .AddHandler <tech.msgp.groupmanager.Code.EventHandlers.EventHandler>() .Services .AddDefaultMiraiHttpFramework() // 表示使用 mirai-api-http 实现的构建器 .ResolveParser <tech.msgp.groupmanager.Code.EventHandlers.EventHandler>() // 只提前解析 DynamicPlugin 将要用到的消息解析器 .AddInvoker <MiraiHttpMessageHandlerInvoker>() // 使用默认的调度器 .AddClient <MiraiHttpSession>() // 使用默认的客户端 .Services // 由于 IMiraiHttpSession 使用 IOptions<MiraiHttpSessionOptions>, 其作为 Singleton 被注册 // 配置此项将配置基于此 IServiceProvider 全局的连接配置 // 如果你想一个作用域一个配置的话 // 自行做一个实现类, 继承IMiraiHttpSession, 构造参数中使用 IOptionsSnapshot<MiraiHttpSessionOptions> // 并将其传递给父类的构造参数 // 然后在每一个作用域中!先!配置好 IOptionsSnapshot<MiraiHttpSessionOptions>, 再尝试获取 IMiraiHttpSession .Configure <MiraiHttpSessionOptions>(options => { options.Host = host; options.Port = port; // 端口 options.AuthKey = key; // 凭据 }) .AddLogging() .BuildServiceProvider(); IServiceScope scope = services.CreateScope(); //var x = (IAsyncDisposable)scope; //await using AsyncServiceScope scope = services.CreateAsyncScope(); // 自 .NET 6.0 起才可以如此操作代替上边两句 services = scope.ServiceProvider; IMiraiHttpSession session = services.GetRequiredService <IMiraiHttpSession>(); // 大部分服务都基于接口注册, 请使用接口作为类型解析 session.ConnectAsync(me_qq).Wait(); // 填入期望连接到的机器人QQ号 MainHolder.session = session; } //MainHolder.session.GetFriendListAsync().Wait(); logger("MainThread", "BotAPI is up.", ConsoleColor.Black, ConsoleColor.Green); pool = new pThreadPool(); MainHolder.pool = pool; logger("MainThread", "Threadpool is UP.", ConsoleColor.Black, ConsoleColor.Green); pool.submitWorkload(() => { while (true) { /* * logger("threadpool", "threads= " + pool.min_size + "<" + pool.size + "/" + pool.busythread + "<" + pool.max_size + * " | works= " + pool.queuelen + "<" + pool.queue_max_len + " | errors= " + pool.excepttionlen + "<" + pool.exceptionmaxlen * ); */ Dictionary <Guid, Exception> err = pool.popException(); if (err != null) { foreach (KeyValuePair <Guid, Exception> e in err) { logger("threadpool_exception", "Work-" + e.Key + " -> " + e.Value.Message, ConsoleColor.DarkRed); logger("threadpool_exception", "Work-" + e.Key + " -> " + e.Value.StackTrace, ConsoleColor.DarkRed); } } pool.clearExceptions(); Thread.Sleep(1000); } }); pool.onWorkloadStartProcess += startwork; pool.onWorkloadStopProcess += stopwork; logger("MainThread", "Events registered.", ConsoleColor.Black, ConsoleColor.Green); MainHolder.INIT(config); //string xml = "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><msg serviceID=\"35\" templateID=\"1\" action=\"viewMultiMsg\" brief=\"[聊天记录]\" m_resid=\"y0oBW4IOb1T2mMOQXiMI9tajqUkTEioFVMFc66YCia2fQEx2+Sp1Bogtcn80e6R+\" m_fileName=\"6858932750478640422\" tSum=\"34\" sourceMsgId=\"0\" url=\"\" flag=\"3\" adverSign=\"0\" multiMsgFlag=\"0\"><item layout=\"1\" advertiser_id=\"0\" aid=\"0\"><title size=\"34\" maxLines=\"2\" lineSpace=\"12\">群聊的聊天记录</title><title size=\"26\" color=\"#777777\" maxLines=\"4\" lineSpace=\"12\">古小艺: 《迷惑行为》新增1个影像</title><title size=\"26\" color=\"#777777\" maxLines=\"4\" lineSpace=\"12\">柠檬味的海鲜龙: 嗯呢</title><title size=\"26\" color=\"#777777\" maxLines=\"4\" lineSpace=\"12\">一只鸡蛋: 新的机器人核心功能已经快移植好了\n现在是离线状态\n这几天要辛苦大家手动处理这些…</ title >< title size =\"26\" color=\"#777777\" maxLines=\"4\" lineSpace=\"12\">呆 萌呆萌瓜: ohhhhhhh</title><hr hidden=\"false\" style=\"0\" /><summary size=\"26\" color=\"#777777\">查看34条转发消息</summary></item><source name=\"聊天记录\" icon=\"\" action=\"\" appid=\"-1\" /></msg>"; //api.sendXmlMessage(417944217, xml, MsgType.GROUP); //Console.Title = "ManageBot By Developer_ken - Standby"; try { /* * MainHolder.session.GroupMessageEvt += new Event_GroupMessage().GroupMessage; * MainHolder.session.GroupApplyEvt += new GroupEnterRequest().GroupApply; * MainHolder.session.GroupMemberJoinedEvt += new GroupMemberIncrease().GroupMemberJoined; * GroupMemberLeave gleave = new GroupMemberLeave(); * MainHolder.session.GroupMemberKickedEvt += gleave.GroupMemberKicked; * MainHolder.session.GroupMemberPositiveLeaveEvt += gleave.GroupMemberPositiveLeave; * PrivMessageHan pmsg = new PrivMessageHan(); * MainHolder.session.TempMessageEvt += pmsg.TempMessage; * MainHolder.session.FriendMessageEvt += pmsg.FriendMessage; * /* * han.onGroupMessageReceive += new Event_GroupMessage().GroupMessage; * han.onPrivateMessageReceive += new Event_PrivMessage().PrivateMessage; * han.onGroupMemberIncrease += new Event_GroupMemberIncrease().GroupMemberIncrease; * han.onGroupMemberDecrease += new Event_GroupMemberLeave().GroupMemberDecrease; * han.onGroupEnterRequest += new Event_GroupMemberRequest().GroupAddRequest; * han.onGroupMessageSendOkay += onSendSuccess; */ logger("MainThread", "Event Recevier is UP.", ConsoleColor.Black, ConsoleColor.White); } catch (Exception) { logger("MainThread", "Event Recevier FAILED.", ConsoleColor.Black, ConsoleColor.Red); } logger("MainThread", "Stand by. The bot is up and ready to go. Type to set an log filter.", ConsoleColor.Black, ConsoleColor.Green); #if RELEASE MainHolder.broadcaster.BroadcastToAdminGroup("[启动报告]\n" + (DEBUGMODE ? "⚠当前处于调试模式,不适合长期运行⚠\n" : "") + "当前版本:" + codeName + version + "\n" + "启用耗时:" + (DateTime.Now - start).TotalSeconds + "s\n" + "当前授权:" + authenti + "\n" + "授权约束:" + (MainHolder.useBiliRecFuncs ? "" : "[MainHolder.useBiliRecFuncs=False]\n") + (MainHolder.enableNativeFuncs ? "" : "[MainHolder.enableNativeFuncs=False]\n")) ; #endif if (booted) { MainHolder.broadcaster.BroadcastToAdminGroup("严重故障\n机器人遭遇了不可恢复的错误,主线程无法继续运行。为了确保稳定运行," + "主线程已被系统重置。该操作成功完成,程序将会继续运行,但未保存的工作可能已经丢失。\n"); MainHolder.broadcaster.BroadcastToAdminGroup("错误报告\n" + exc.Message + "\nStackTrace >" + exc.StackTrace); } booted = true; while (true) { try { string field = ""; do { ConsoleKeyInfo k = Console.ReadKey(true); if (k.Key == ConsoleKey.Enter) { break; } if (k.Key == ConsoleKey.Backspace) { if (field.Length >= 1) { field = field.Substring(0, field.Length - 1); } continue; } if (k.Key == ConsoleKey.Delete) { field = ""; continue; } field += k.KeyChar; //Console.Title = "input>" + field + " | Press [Enter] to " + (field.Length >= 1 ? "set" : "remove") + " a filter."; } while (true); keyword = field; if (keyword != "") { logger("control", "Filter set.", ConsoleColor.Black, ConsoleColor.Green); //Console.Title = "Filter: " + keyword + " | Press [Enter] to remove filter"; } else { logger("control", "Filter removed.", ConsoleColor.Black, ConsoleColor.Green); //Console.Title = "ManageBot By Developer_ken - Standby"; } } catch { Thread.Sleep(int.MaxValue); } } ; } catch (Exception err) { exc = err; logger("EXCEPTION", "E_FATAL " + err.Message, ConsoleColor.Black, ConsoleColor.Red); logger("EXCEPTION", "STACKTRACE " + err.StackTrace, ConsoleColor.Black, ConsoleColor.Red); //throw; } } }