Пример #1
0
        public async Task <IActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                User user = new User {
                    Email = model.Email, UserName = model.Login
                };
                var l = await _userman.FindByNameAsync(model.Login);

                if (l != null && l.UserName == model.Login)
                {
                    ModelState.AddModelError("", "Пользователь с таким логином уже зарегестрирован");
                }

                if (!user.Email.EndsWith("@gmail.com"))
                {
                    ModelState.AddModelError("", "Your Email is not correct ");
                }


                var result = await _userman.CreateAsync(user, model.Password);


                if (result.Succeeded)
                {
                    var code = await _userman.GenerateEmailConfirmationTokenAsync(user);

                    var callbackUrl = Url.Action(
                        "ConfirmEmail",
                        "Account",
                        new { userid = user.Id, code = code },
                        protocol: HttpContext.Request.Scheme);
                    mailService mailService = new mailService();
                    await mailService.SendEmailAsyns(model.Email, "Confirm your account",
                                                     $"Подтвердите регистрацию, перейдя по ссылке: <a href='{callbackUrl}'>link</a>");

                    await _sigman.SignInAsync(user, false);

                    return(Content("Для завершения регистрации проверьте электронную почту и перейдите по ссылке, указанной в письме"));
                }
                else
                {
                    foreach (var error in result.Errors)
                    {
                        ModelState.AddModelError(string.Empty, error.Description);
                    }
                }
            }

            return(View());
        }
Пример #2
0
        private async void tickEvent(object sender, System.Timers.ElapsedEventArgs e)   // 计时器循环事件
        {
            Logger.Debug("计时器循环事件开始执行。");
            // 获取宕机数据
            var downServers = await fetchDownServer(uri);

            Logger.Debug("成功获得宕机数据。");
            string[] diff;
            if (downServers.Length > 0)   // 存在宕机数据
            {
                Logger.Debug("存在宕机事件。");

                // 初始化 ID 组, 缓存目前事件中宕机的 id
                List <string> existIdGroup = new List <string>();
                foreach (var downServer in downServers)
                {
                    // 缓存 id
                    existIdGroup.Add(downServer.id);

                    // 首先检测一下此 id 是否存在
                    var ids = downServerIds.ToArray();
                    if (Array.IndexOf(ids, downServer.id) == -1)           // 如果不存在, 那么就开始通知流程
                    {
                        addLog(downServer.id, "down", downServer.startTs); // 添加故障日志
                        Logger.Debug("标识:" + downServer.id + ", 初次发现宕机, 开始通知流程。");
                        // 首先,初始化 down
                        var child = new down()
                        {
                            id      = downServer.id,
                            startTS = downServer.startTs
                        };

                        var starTime = ConvertTimeStampToDateTime(child.startTS);

                        // 把记录写入缓存列表
                        downServerIds.Add(downServer.id);
                        downServerList.Add(child);

                        Logger.Debug("标识:" + downServer.id + ", 已经将信息写入缓存列表。");

                        // 发送通知任务
                        Logger.Debug("标识:" + downServer.id + " -> 开始读取配置项, 并执行配置映射。");
                        // 读取配置
                        var     parser = new FileIniDataParser();
                        IniData config = parser.ReadFile(configFile);

                        // 映射配置
                        string[] groups = config["notification"]["group"].Split(',');
                        string[] mails  = config["notification"]["mail"].Split(',');

                        // 1. 发送给 QQ 群组
                        Logger.Debug("标识:" + downServer.id + " -> 开始通知群组。");
                        foreach (var group in groups)
                        {
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                            Task.Factory.StartNew(() => {
                                using (var robotSession = MahuaRobotManager.Instance.CreateSession()) {
                                    var api    = robotSession.MahuaApi;
                                    string msg = "警报, 一言节点出现故障!\r\n"
                                                 + "节点标识: " + downServer.id + "\r\n"
                                                 + "触发时间: " + starTime.ToString("s") + "\r\n"
                                                 + fetchHitokotoText();
                                    api.SendGroupMessage(group, msg);
                                    Logger.Debug("标识:" + downServer.id + " -> 已通知群组: " + group);
                                }
                            });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        }

                        // 2. 发送广播邮件
                        Logger.Debug("标识:" + downServer.id + " -> 开始邮件通知。");
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        Task.Factory.StartNew(() => {
                            var smtp = new mailService();
                            var sub  = "一言故障警告";
                            var msg  = "警报, 一言节点出现故障。\r\n"
                                       + "节点标识: " + downServer.id + "\r\n"
                                       + "触发时间: " + starTime.ToString("s") + "\r\n"
                                       + fetchHitokotoText();
                            smtp.Send(mails, sub, msg);
                            Logger.Debug("标识:" + downServer.id + " -> 已通知邮件: " + mails.ToString());
                        });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        Logger.Debug("标识:" + downServer.id + " -> 同步任务已经完成, 请等待异步程序执行完毕。");
                    }
                }

                // 求当前宕机列表和缓存列表的补集, 然后通知
                Logger.Debug("正在求当前宕机列表和缓存列表的补集...");
                diff = downServerIds.ToArray().Where(c => !existIdGroup.ToArray().Contains(c)).ToArray();
            }
            else
            {
                diff = downServerIds.ToArray(); // 既然宕机列表不存在, 说明所有节点正常。 如果缓存存在内容, 全部释放。
            }

            if (diff.Length > 0)   // 缓存区 ids 多于目前宕机的 ids, 所以有节点恢复了。 发生恢复行为
            {
                Logger.Debug("补集不为空集, 进行恢复事件。");
                foreach (var id in diff)
                {
                    DateTime startTime = DateTime.Now;
                    // 从缓存区移除
                    Logger.Debug("标识:" + id + " -> 从缓存区中移除纪录。");
                    downServerIds.RemoveAll(c => downServerIds.Contains(c));
                    for (int i = downServerList.Count - 1; i >= 0; i--)
                    {
                        if (downServerList[i].id == id)
                        {
                            startTime = ConvertTimeStampToDateTime(downServerList[i].startTS);
                            downServerList.RemoveAt(i);
                        }
                    }
                    // 获取持续时间
                    var now      = DateTime.Now;
                    var distance = now - startTime;
                    var last     = distance.Days + " 天 " + distance.Hours + " 时 " + distance.Minutes + " 分 " + distance.Seconds + " 秒 ";
                    addLog(id, "up", ConvertDateTimeToTimeStamp(now));

                    Logger.Debug("标识:" + id + " -> 开始读取配置项, 并执行配置映射。");
                    // 读取配置
                    var     parser = new FileIniDataParser();
                    IniData config = parser.ReadFile(configFile);

                    // 映射配置
                    string[] groups = config["notification"]["group"].Split(',');
                    string[] mails  = config["notification"]["mail"].Split(',');

                    // 1. 发送给 QQ 群组
                    Logger.Debug("标识:" + id + " -> 开始通知群组。");
                    foreach (var group in groups)
                    {
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                        Task.Factory.StartNew(() => {
                            using (var robotSession = MahuaRobotManager.Instance.CreateSession()) {
                                var api    = robotSession.MahuaApi;
                                string msg = "一言节点已从故障中恢复。\r\n"
                                             + "节点标识: " + id + "\r\n"
                                             + "持续时间: " + last + "\r\n"
                                             + fetchHitokotoText();
                                api.SendGroupMessage(group, msg);
                                Logger.Debug("标识:" + id + " -> 已通知群组: " + group);
                            }
                        });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                    }

                    // 2. 发送广播邮件
                    Logger.Debug("标识:" + id + " -> 开始邮件通知。");
#pragma warning disable CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                    Task.Factory.StartNew(() => {
                        var smtp = new mailService();
                        var sub  = "一言已从故障中恢复";
                        var msg  = "一言节点已从故障中恢复。\r\n"
                                   + "节点标识: " + id + "\r\n"
                                   + "持续时间: " + last + "\r\n"
                                   + fetchHitokotoText();
                        smtp.Send(mails, sub, msg);
                        Logger.Debug("标识:" + id + " -> 已通知邮件: " + mails.ToString());
                    });
#pragma warning restore CS4014 // 由于此调用不会等待,因此在调用完成前将继续执行当前方法
                    Logger.Debug("标识:" + id + " -> 同步任务已经完成, 请等待异步程序执行完毕。");
                }
            }
            dumpData();
        }