package profileHandler import ( "fmt" "runtime/debug" "gitea.cybertalant.ru/VisionCareerMiniapp/MiniappGoService/internal/application/constants" "gitea.cybertalant.ru/VisionCareerMiniapp/MiniappGoService/internal/application/types" "gitea.cybertalant.ru/VisionCareerMiniapp/MiniappGoService/internal/application/utils" tele "gopkg.in/telebot.v4" ) func (t *handler) universalTextHandler(ctx tele.Context) error { op := "profileHandler/universalTextHandler" // Start recovering defer func() { if r := recover(); r != nil { t.logger.Error(fmt.Sprintf("%v - Panic recovered: %v\nStack trace:\n%s", op, r, debug.Stack())) } }() // Common variables msg := "" val := ctx.Text() needUpdateUser := true mainKeys := new(tele.ReplyMarkup) // Check user var id int64 var username *string if ctx.Chat().Username == "" { username = nil } else { username = &ctx.Chat().Username } id = ctx.Chat().ID user, err := t.profileService.CheckUser(id, username) if err != nil { t.logger.Error(fmt.Sprintf("%v: %v", op, err.Error())) return nil } // Check active status and save current value if val == constants.ResetBotCommand { if user.ResumePath != nil { err := t.profileService.DeleteResume(*user.ResumePath) if err != nil { return ctx.Send(constants.ErrorResetBotMessage) } } user = &types.User{ ID: user.ID, Username: user.Username, ActiveStatus: constants.DefaultStatus, TargetRole: nil, ResumePath: nil, WorkExperience: nil, WorkFormat: nil, SalaryRange: nil, } msg = constants.SuccessResetBotMessage } else if val == constants.HelpBotCommand { needUpdateUser = false msg = constants.HelpBotMessage } else if (user.ActiveStatus == constants.DefaultStatus) && (val == constants.StartBotCommand) { user.ActiveStatus = constants.WaitPickJobOrMarketStatus // Set menu mainKeys = &tele.ReplyMarkup{ResizeKeyboard: true} jobSearchBtn := mainKeys.Text(constants.JobSearchBotButton) // TODO: marketAnalyticsBtn := mainKeys.Text(constants.MarketAnalyticsBotButton) mainKeys.Reply( mainKeys.Row(jobSearchBtn), // TODO: mainKeys.Row(marketAnalyticsBtn), ) msg = constants.StartBotMessage } else if (user.ActiveStatus != constants.DefaultStatus) && (val == constants.StartBotCommand) { needUpdateUser = false msg = constants.SecondStartBotMessage } else if (user.ActiveStatus == constants.WaitPickJobOrMarketStatus) && (val == constants.JobSearchBotButton) { user.ActiveStatus = constants.WaitPickResumeStatus // Set menu mainKeys = &tele.ReplyMarkup{ResizeKeyboard: true} uploadResumeBtn := mainKeys.Text(constants.UploadResumeBotButton) skipBtn := mainKeys.Text(constants.SkipBotButton) mainKeys.Reply( mainKeys.Row(uploadResumeBtn), mainKeys.Row(skipBtn), ) msg = constants.StartProfileCompletionBotMessage } else if (user.ActiveStatus == constants.WaitPickResumeStatus) && (val == constants.SkipBotButton) { user.ActiveStatus = constants.WaitAnswerQuestionsStatus // Set menu mainKeys = &tele.ReplyMarkup{ResizeKeyboard: true} answerQuestionsBtn := mainKeys.Text(constants.AnswerQuestionsBotButton) mainKeys.Reply( mainKeys.Row(answerQuestionsBtn), ) msg = constants.SkipResumeBotMessage } else if (user.ActiveStatus == constants.WaitPickResumeStatus) && (val == constants.UploadResumeBotButton) { user.ActiveStatus = constants.WaitResumeStatus // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} msg = constants.WaitResumeBotMessage } else if (user.ActiveStatus == constants.WaitResumeStatus) && (val == constants.UploadResumeBotButton) { needUpdateUser = false // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} msg = constants.WaitResumeBotMessage } else if (user.ActiveStatus == constants.WaitAnswerQuestionsStatus) && (val == constants.AnswerQuestionsBotButton) { user.ActiveStatus = constants.WaitWorkFormatStatus // Set menu mainKeys = &tele.ReplyMarkup{ResizeKeyboard: true} remoteBtn := mainKeys.Text(constants.RemoteWorkFormat.String()) hybridBtn := mainKeys.Text(constants.HybridWorkFormat.String()) onSiteBtn := mainKeys.Text(constants.OnSiteWorkFormat.String()) defaultBtn := mainKeys.Text(constants.DefaultWorkFormat.String()) mainKeys.Reply( mainKeys.Row(remoteBtn), mainKeys.Row(hybridBtn), mainKeys.Row(onSiteBtn), mainKeys.Row(defaultBtn), ) msg = constants.StartAnswerQuestionsBotMessage } else if user.ActiveStatus == constants.WaitWorkFormatStatus && constants.WorkFormat(val).Valid() { wf := constants.WorkFormat(val) user.WorkFormat = &wf user.ActiveStatus = constants.WaitTargetRoleStatus // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} msg = constants.AcceptWorkFormatBotMessage } else if user.ActiveStatus == constants.WaitTargetRoleStatus { user.TargetRole = &val user.ActiveStatus = constants.WaitSalaryRangeStatus // Set menu mainKeys = &tele.ReplyMarkup{ResizeKeyboard: true} firstStepBtn := mainKeys.Text(constants.FirstStepSalaryRange.String()) secondStepBtn := mainKeys.Text(constants.SecondStepSalaryRange.String()) thirdStepBtn := mainKeys.Text(constants.ThirdStepSalaryRange.String()) fourthStepBtn := mainKeys.Text(constants.FourthStepSalaryRange.String()) defaultStepBtn := mainKeys.Text(constants.DefaultSalaryRange.String()) mainKeys.Reply( mainKeys.Row(firstStepBtn), mainKeys.Row(secondStepBtn), mainKeys.Row(thirdStepBtn), mainKeys.Row(fourthStepBtn), mainKeys.Row(defaultStepBtn), ) msg = constants.AcceptTargetRoleBotMessage } else if user.ActiveStatus == constants.WaitSalaryRangeStatus && constants.SalaryRange(val).Valid() { sr := constants.SalaryRange(val) user.SalaryRange = &sr user.ActiveStatus = constants.WaitWorkExperienceStatus // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} msg = constants.AcceptSalaryRangeBotMessage } else if user.ActiveStatus == constants.WaitWorkExperienceStatus { user.WorkExperience = &val user.ActiveStatus = constants.FinishedStatus if !utils.ValidateWorkExperience(&val) { return ctx.Send(constants.InvalidWorkExperienceErrorBotMessage) } // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} msg = constants.FinishedBotMessage } else if val == constants.ShowProfileBotCommand && !utils.CheckProfileCompletion(user) { needUpdateUser = false // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} msg = constants.CanNotShowProfileBotMessage } else if val == constants.ShowProfileBotCommand && utils.CheckProfileCompletion(user) { needUpdateUser = false // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} var resume string if user.ResumePath == nil { resume = constants.ErrorEmoji } else { resume = constants.SuccessEmoji } msg = fmt.Sprintf( "Резюме: %v\nЗарплатная вилка: %v\nДолжность: %v\nОпыт работы: %v\nФормат работы: %v\n", resume, user.SalaryRange, *user.TargetRole, *user.WorkExperience, user.WorkFormat, ) } else if val == constants.ShowVacanciesBotCommand && !utils.CheckProfileCompletion(user) { needUpdateUser = false // Set menu mainKeys = &tele.ReplyMarkup{RemoveKeyboard: true} msg = constants.CanNotShowVacanciesBotMessage } else if val == constants.ShowVacanciesBotCommand && utils.CheckProfileCompletion(user) { vacancies, err := t.profileService.GetVacancies(user.ID) if err != nil { t.logger.Error(fmt.Sprintf("%v: %v", op, err.Error())) return ctx.Send(constants.GetVacanciesErrorBotMessage) } else if len(vacancies) == 0 { return ctx.Send(constants.NoVacanciesBotMessage) } for _, vacancy := range vacancies { _, err = t.bot.Send( &tele.Chat{ID: user.ID}, vacancy, &tele.SendOptions{ ParseMode: tele.ModeHTML, }, ) if err != nil { t.logger.Error(fmt.Sprintf("%v: %v", op, err.Error())) } } return nil } else { needUpdateUser = false msg = constants.UnknownCommandBotMessage } // Set new user data if needUpdateUser { err = t.profileService.UpdateUser(user) if err != nil { t.logger.Error(fmt.Sprintf("%v: %v", op, err.Error())) return ctx.Send(constants.UpdateUserErrorBotMessage) } } return ctx.Send(msg, mainKeys) }