Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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;
                }
            }
        }